Wir haben hier ein Zählermodul der Firma Deditec. Dieses Modul wird im Sekundentakt abgefragt. es sind 9 Geräte angeschlossen. Der Abfragecode sieht wie folgt aus:
' Variablen der Anwendung Public Const MAXANZAHL As Integer = 9 Dim LetzterStand(MAXANZAHL), Zählwert As UInteger Dim MySQLcmd As New MySqlCommand Dim MySQLDatenbankverbindung As New MySqlConnection Dim Zeitpunkt As String Dim Millisekunden As String Dim Zahl As Integer
Private Sub tmrAbfrage_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAbfrage.Tick
Dim handle As UInteger
If MySQLDatenbankverbindung.State = ConnectionState.Closed Then MySQLDatenbankverbindung.ConnectionString = My.Settings.MySQLConnectionString MySQLcmd.Connection = MySQLDatenbankverbindung
Try Using MySQLDatenbankverbindung MySQLDatenbankverbindung.Open()
' Überprüfen, ob ein Zähler auf Null gesetzt werden soll
If File.Exists("...\resetMaschine1Tisch1") Then Try handle = DapiOpenModule(DELib.RO_ETH, 0) Zählwert = DapiDIGetCounter(handle, 0, DAPI_CNT_MODE_READ_WITH_RESET) Zeitpunkt = Now.Year & "-" & Now.Month & "-" & Now.Day & " " & Now.Hour & ":" & Now.Minute & ":" & Now.Second Millisekunden = Now.Millisecond.ToString Zahl = Convert.ToInt16(Zählwert) MySQLcmd.CommandText = "INSERT into bde(Zeit, Zeitmillisekunden, Maschine, Zaehlerstand1) Values ('" & Zeitpunkt & "','" & Millisekunden & "',0815, '" & Zahl & "')" MySQLcmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message) End Try File.Delete("+++...+++") LetzterStand(1) = Zählwert DapiCloseModule(handle)
Wenn ich das Programm starte läuft alles über mehrere Stunden so wie ich es mir erhoffe. Wenn ich morgens den Monitor einschalte, ist alles eingefroren. Dann kann ich das Programm beenden und ohne Wartezeit wieder starten und das Spielchen geht von vorne los. In der XP-Verwaltung kann ich erkennen, dass es gleichzeitig zu Problemen mit der Erteilung von Gruppenrichtlinien kommt. Meine Vermutung ist das ich irgendwie den Netzwerkadapter blockiere. Aber wie und warum? Hat jmd einen Tip für mich?
also auf den ersten blick sieht es für mich aus, als ob du jede sekunde die mysqlconnection frisch öffnest und wieder schließt. vielleicht wäre es günstiger, die connection nur einmal zu beginn zu öffnen (und auch wenn sie aus irgendwelchen gründen wieder weg sein sollte) statt zig tausende mal.
Danke für die Antwort. Aber ich dachte, wenn ich die connection in einem USING-Block öffne wird die Verbindung automatisch an den Garbage Collector weitergegeben und damit entfernt?
Soweit korrekt, das Connection-Object wird gelöscht. Aber der Connectionpool ist unabhängig vom Connection-Object und ist ein ADO.Net-Internal auf welches man mit absicht keinen einfluss mit Dispose nehmen kann. Die MSDN schreibt dazu: "Connection pooling reduces the number of times that new connections must be opened. The pooler maintains ownership of the physical connection. It manages connections by keeping alive a set of active connections for each given connection configuration. Whenever a user calls Open on a connection, the pooler looks for an available connection in the pool."
Hört sich an, als sei irgendeine Ressource ausgegangen. Entweder RAM (memory leak) oder netzwerk connections. Du kannst das debuggen, indem du in eine txt Datei in dem timer tick handler jedes mal wenn der lief reinschreibst die uhrzeit und den ram verbrauch. Dann siehst du morgens wo der abgeschmiert ist. Außerdem kill das Programm morgens nicht sondern mach debugger break und sieh dich um. Schau im process epxlorer auf die anzahl der handles und des ram-verbrauch.
O.k. Ich werde das mal versuchen, dass ich das zusammen gebastelt bekomme. Auf dem Rechner auf dem das läuft, frieren alle anderen Fenster mit ein erst wenn ich das Zählerprogramm schließe, kann ich die anderen Fenster wieder benutzen.
Wenn alle miteinfrieren hört sich das nach Ram alle an. Die frieren nicht ein, die sind nur so langsam. Vllt hat auch deine native Meßkomponente ein Speicherleck.
Als best-practice würde ich empfehlen, die Instanzvariablen in lokale Variablen der timer Methode zu ändern, damit die auch garantiert kein Leck verursachen. Ich meine die connection und das command.