| 

.NET C# Java Javascript Exception

3
Hallo zusammen.

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:
Option Explicit On
Option Strict On

Imports System.Data.OleDb
Imports MySql.Data
Imports MySql.Data.MySqlClient
Imports Microsoft.Win32
Imports ZählerAbfragedienst.DELib
Imports System.IO

Public Class BDE



' 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)

'....die gleiche Abfrage für andere Zähler


Else


' ... und Zählerstand in Datenbank schreiben

' Abfrage Maschine 1 Tisch 1
Try
handle = DapiOpenModule(DELib.RO_ETH, 0)
Zählwert = DapiDIGetCounter(handle, 0, 0)
If Zählwert <> LetzterStand(1) Then
txtzaehler1.Text = Zählwert & " - " & Now.ToString
Zeitpunkt = Now.Year & "-" & Now.Month & "-" & Now.Day & " " & Now.Hour & ":" & Now.Minute & ":" & Now.Second
Millisekunden = Now.Millisecond.ToString
MySQLcmd.CommandText = "INSERT into bde(Zeit, Zeitmillisekunden, Maschine, Zaehlerstand1) Values ('" & Zeitpunkt & "','" & Millisekunden & "',0815, '" & Zählwert & "')"
MySQLcmd.ExecuteNonQuery()
End If
Catch ex As Exception
MsgBox(ex.Message)
Finally
DapiCloseModule(handle)
End Try
LetzterStand(1) = Zählwert

'... gleiche Abfrage für andere Maschinen

End If
End Sub

End Class


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?

Schönen Gruß Moritz
17.05.2011
MoS 33 4
2 Antworten
2
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.
17.05.2011
nabuchodonossor 1,3k 5
Das ist weitesgehend egal da .Net intern nen Connectionpool verwalltet und ich kein MySQLcmd.Close() sehe. Trotzdem hast du recht (+1).
Floyd 17.05.2011
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?

SG
MoS 17.05.2011
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."
Floyd 17.05.2011
Mehr dazu im passenden MSDN-Artikel "SQL Server Connection Pooling (ADO.NET)" unter http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx
Floyd 17.05.2011
1
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.
17.05.2011
alexander 860 2 9
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.
MoS 18.05.2011
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.
alexander 18.05.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH