MySQL Timeout expired

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    MySQL Timeout expired

    Hallo Zusammen,

    ich glaube ich mach da bei der Datenbankprogrammierung was falsch...
    Also ich möchte das mein Programm Ordner durchsucht und dann schaut ob die Datein schon in der Datenbank vorhanden sind. Das funktioniert auch so weit. Leider bekomme ich jetzt eine Fehlermeldung die ich nicht so ganz nachvollziehen kann.



    Wenn ich das richtig verstehe gibt es einen Timeout ? Liegt es daran das zu viele anfragen in zu kurzer Zeit gestellt werden? Ist es damit getan den Timeout beim MySql Server zu erhöhen? Oder liegt es doch an meiner Programmierung bzw. an den Abfragen und dem Insert?

    Hier der Teil der für das auswählen der Ordner oder des Ordners verantwortlich ist:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim serie As String = ComboBox1.Text
    3. If serie = "Alle Serien" Then
    4. Dim server As String = INI_ReadValueFromFile("Einstellungen", "server", "", ".\cfg.ini")
    5. Dim user As String = INI_ReadValueFromFile("Einstellungen", "user", "", ".\cfg.ini")
    6. Dim passwort As String = INI_ReadValueFromFile("Einstellungen", "passwort", "", ".\cfg.ini")
    7. Dim datenbank As String = INI_ReadValueFromFile("Einstellungen", "datenbank", "", ".\cfg.ini")
    8. Dim myConnectionString2 As String
    9. Dim reader As MySql.Data.MySqlClient.MySqlDataReader
    10. myConnectionString2 = "server=" & server & ";uid=" & user & ";pwd=" & passwort & ";database=" & datenbank & ";"
    11. Dim myConnection2 As New MySqlConnection(myConnectionString2)
    12. Dim myInsertQuery2 As String = "SELECT * FROM serien WHERE status = 'ja' ORDER BY serienname"
    13. Dim myCommand2 As New MySqlCommand(myInsertQuery2)
    14. myCommand2.Connection = myConnection2
    15. myConnection2.Open()
    16. reader = myCommand2.ExecuteReader
    17. Do While reader.Read()
    18. Dim serienname As String = reader("serienname")
    19. indexierungserien(serienname)
    20. Loop
    21. myCommand2.Connection.Close()
    22. Else
    23. indexierungserien(serie)
    24. End If
    25. End Sub


    Und hier der Code womit ich die Daten überprüfe:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub indexierungserien(serie As String)
    2. Dim serienname As String = serie
    3. Dim server As String = INI_ReadValueFromFile("Einstellungen", "server", "", ".\cfg.ini")
    4. Dim user As String = INI_ReadValueFromFile("Einstellungen", "user", "", ".\cfg.ini")
    5. Dim passwort As String = INI_ReadValueFromFile("Einstellungen", "passwort", "", ".\cfg.ini")
    6. Dim datenbank As String = INI_ReadValueFromFile("Einstellungen", "datenbank", "", ".\cfg.ini")
    7. Dim myConnectionString2 As String
    8. Dim reader As MySql.Data.MySqlClient.MySqlDataReader
    9. myConnectionString2 = "server=" & server & ";uid=" & user & ";pwd=" & passwort & ";database=" & datenbank & ";"
    10. Dim myConnection2 As New MySqlConnection(myConnectionString2)
    11. Dim myInsertQuery2 As String = "SELECT * FROM serien WHERE serienname = '" & serienname & "'"
    12. Dim myCommand2 As New MySqlCommand(myInsertQuery2)
    13. myCommand2.Connection = myConnection2
    14. myConnection2.Open()
    15. reader = myCommand2.ExecuteReader
    16. Do While reader.Read()
    17. Dim pfad As String = reader("pfad")
    18. Dim pfadbackslash As String = Replace(pfad, "\", "\\\")
    19. Dim thetvdbapi As String = reader("thetvdbapi")
    20. Dim xrelapi As String = reader("xrelapi")
    21. ListBox1.Items.Add(pfad)
    22. For Each unterordner In My.Computer.FileSystem.GetDirectories(pfad)
    23. Dim arrayordner() As String = Split(unterordner, "\")
    24. Dim arrayordnerteile As String = arrayordner.Count - 1
    25. ListBox1.Items.Add(arrayordner(arrayordnerteile))
    26. For Each datein In My.Computer.FileSystem.GetFiles(unterordner)
    27. 'ListBox1.Items.Add(datein)
    28. Dim infoReader As System.IO.FileInfo
    29. infoReader = My.Computer.FileSystem.GetFileInfo(datein)
    30. Dim dateifilesize As String = infoReader.Length
    31. Dim arraydatei() As String = Split(datein, "\")
    32. Dim arraydateiteile As String = arraydatei.Count - 1
    33. Dim datei As String = arraydatei(arraydateiteile)
    34. Dim serieordner As String = arraydatei(arraydatei.Count - 2)
    35. Dim laenge As String = datei.Length - 4
    36. Dim releasename As String = datei.Substring(0, laenge)
    37. Dim myConnectionString As String
    38. myConnectionString = "server=" & server & ";uid=" & user & ";pwd=" & passwort & ";database=" & datenbank & ";"
    39. Dim myConnection As New MySqlConnection(myConnectionString)
    40. Dim myInsertQuery As String = "SELECT COUNT(*) FROM content WHERE datei = '" & datei & "'"
    41. Dim myCommand As New MySqlCommand(myInsertQuery)
    42. myCommand.Connection = myConnection
    43. myConnection.Open()
    44. Dim numb = CInt(myCommand.ExecuteScalar())
    45. If numb < 1 Then
    46. ListBox1.Items.Add(datei)
    47. myCommand.Connection.Close()
    48. '
    49. Dim myConnectionString3 As String
    50. myConnectionString3 = "server=" & server & ";uid=" & user & ";pwd=" & passwort & ";database=" & datenbank & ";"
    51. Dim myConnection3 As New MySqlConnection(myConnectionString3)
    52. Dim myInsertQuery3 As String = "INSERT INTO `davenet`.`content` (`id`, `typ`, `serie`, `serieordner`, `datei`, `releasename`, `pfad`, `quali`, `staffel`, `episode`, `titel`, `plot`, `filesize`, `releasegroup`, `videotype`, `audiotype`, `status`, `nzbdllink`, `retention`, `thetvdbapi`, `xrelapi`, `imdb`, `cover`, `erfasst`) VALUES (NULL, 'Serie', '" & serienname & "', '" & serieordner & "', '" & datei & "', '" & releasename & "', '" & pfadbackslash & "', NULL, NULL, NULL, NULL, NULL, '" & dateifilesize & "', NULL, NULL, NULL, NULL, NULL, NULL, '" & thetvdbapi & "', '" & xrelapi & "', NULL, NULL, NULL)"
    53. Dim myCommand3 As New MySqlCommand(myInsertQuery3)
    54. myCommand3.Connection = myConnection3
    55. myConnection3.Open()
    56. myCommand3.ExecuteNonQuery()
    57. myCommand3.Connection.Close()
    58. System.Threading.Thread.Sleep(500)
    59. '
    60. End If
    61. Next
    62. Next
    63. Loop
    64. myCommand2.Connection.Close()
    65. End Sub


    Ich weiß es ist nicht gut aber darum wende ich mich ja auch ans Forum :) Ich denke bei den MySQL Sachen gibt es noch Optimierungsbedarf :P Aber ich bin froh das ich es überhaupt zum laufen gebracht habe :D

    Danke,

    Diabetiker :thumbup:
    Also, ein Thread verweist auf ein neues Sub. Da schreibst du dann das Ganze von einem der Ausführungen rein.

    VB.NET-Quellcode

    1. Dim t As New Thread(AddressOf MySQL1)
    2. t.Start()
    3. Sub MySQL1()
    4. 'Hier kommt dann der Code zum prüfen rein.
    5. End Sub


    Und das machst du für jede Anfrage.
    Ok hört sich erst mal logisch an , Danke ! :thumbup:
    Ich weiß das ist etwas viel verlangt aber könntest du das für eine SQL Abfrage mal exemplarisch machen damit ich weiß wie es in meinem Fall richtig aussehen muss?
    Das wäre wirklich klasse!

    Danke,

    Diabetiker :thumbsup:
    Also: Vorab, ich kann nicht garantieren, ob das klappt. Du solltest eventuell noch die Threads von bestimmten Punkten aus starten, wenn der andere Thread jeweils beendet ist.

    VB.NET-Quellcode

    1. Dim t As New Thread(AdressOf MySQL3)
    2. t.Start() 'Das solltest du noch machen, wenn die anderen Threads beendet sind
    3. Sub MySQL3()
    4. Dim myCommand3 As New MySqlCommand(myInsertQuery3)
    5. myCommand3.Connection = myConnection3
    6. myConnection3.Open()
    7. myCommand3.ExecuteNonQuery()
    8. myCommand3.Connection.Close()
    9. System.Threading.Thread.Sleep(500)
    10. '
    11. End If
    12. Next
    13. Next
    14. Loop
    15. myCommand2.Connection.Close()
    16. End Sub


    Das blöde ist jetzt, ich musste oben nen Teil weglassen, wegen der Formatierung. Das da einfach wieder reinmachen, also das mit der Connection3.

    Warum eigentlich eine Do-Schleife?
    Weißt du, das Problem ist, dass ich bei deinem Code nicht weiß, was was ist, da der so aufeinander gepresst ist.
    Ungefähr so musst du es dann machen, aber noch anpassen!
    Versuche mal ne andere Timeout-Zeit in dem String.
    Vielleicht solltest du dir noch das ansehen:

    VB.NET-Quellcode

    1. System.Threading.Thread.Sleep(500)


    Mal abgesehen vom aufeinandergepressten Code!
    Hier solltest du mal versuchen den Interval höher zu setzen!
    Wäre einfacher!
    Nein sollte er sich nicht. Wenn ne Datenbank nen Timeout zurückgibt hat das garantiert nix damit zu tun, dass du kein mulithreading verwendest. Und mit Sleep und derartigem Brainfuk auffahren ist da wohl die falsche Lösung. Da der Fehler beim erstellen einer Verbindung auftritt:
    a) Ist die Datenbank gestartet
    b) Ist die Datenbank verfügbar(hast du eine Verbindung darauf - internet Verbindung,...)
    c) Stimmt der Connectionstring
    d) Gibt es eine InnerExeception?
    e) Teste mal mit einem MySQL Client wie z.B. MySQL-Workbench ob du auf die Datenbank kommst.

    An Sperrzuständen hervorgerufen durch Transaktionen wird es beim öffnen einer Verbindung wohl eher weniger liegen. Und außerdem ist MySQL darauf ausgelegt sehr sehr viele Anfragen bearbeiten zu können. Threading ist nicht die Antwort auf alles.

    Außerdem: Vergiss nicht die Verbindung nach den Abfragen wieder zu schließen. Mehrere offene Verbindungen können durchaus zu Problemen führen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hallo Zusammen,

    Antworten:
    a) Ja
    b) Ja (Liegt lokal)
    c) Ja (Daten werden ja auch importiert. Irgendwann kommt der Fehler)
    d) Verstehe die Frage leider nicht
    e) Verbindung kann hergestellt werden

    Ich denke das ich auch überall die verbinung geschlossen haben.

    Danke,

    Diabetiker