Hallo,
ich wende mich heute mit etwas an euch, wobei ich eindeutig am Ende meines Lateins angekommen bin. Wenn die hier vorgestellte Praxis idiotisch ist, freue ich mich natürlich über Alternativvorschläge.
Ich betreibe einen Server für eine Software. Seitdem ich die Datenspeicherung auf eine SQLite-Verbindung umgestellt habe, müllt sich der RAM im laufenden Betrieb sehr schnell zu.
Um einfachen Zugriff auf die Daten der Datenbank möglich zu haben, rufe ich diese als Beispiel so auf:
"Server.dbConnect" ist eine von mir geschriebene Klasse, die folgendermaßen aussieht:
Wie man in meiner Klasse sieht, habe ich schon versucht, den Garbage-Collector manuell anzustoßen (wenn das überhaupt der richtige Befehl ist)
Ich bin bei der Programmierung davon ausgegangen, das Objekte wie die SQLite-Connection am Ende der Sub, die ihn enthält, "zum Abschuss freigegeben" werden und dann aus dem RAM entfernt werden. Dasselbe habe ich für die Funktionen angenommen, die die Propertys aufrufen. Deren Subs dauern im Maximalfall 10 Sekunden, nach denen die in der Property erstellten Objekte nicht mehr aufrufbar sind und dementsprechend gelöscht werden können.
Der Server läuft mit mono-sgen auf einem Debian 8-System.
Nun ist die Frage: Was mache ich falsch? Wie kann ich diese RAM-Flutung beheben oder verringern?
Mit hoffenden Grüßen,
Nico
ich wende mich heute mit etwas an euch, wobei ich eindeutig am Ende meines Lateins angekommen bin. Wenn die hier vorgestellte Praxis idiotisch ist, freue ich mich natürlich über Alternativvorschläge.
Ich betreibe einen Server für eine Software. Seitdem ich die Datenspeicherung auf eine SQLite-Verbindung umgestellt habe, müllt sich der RAM im laufenden Betrieb sehr schnell zu.
Um einfachen Zugriff auf die Daten der Datenbank möglich zu haben, rufe ich diese als Beispiel so auf:
VB.NET-Quellcode
- Public ReadOnly Property Tasks As List(Of Task)
- Get
- Dim data As DataTable = Server.dbConnect.getReader("SELECT ID FROM Tasks WHERE Spedition_ID = " & db_ID)
- If data.Rows.Count = 0 Then : Else
- Dim ret As New List(Of Task)
- For Each row As DataRow In data.Rows
- ret.Add(New Task(row.Item("ID")))
- Next
- Return ret
- End If
- Return Nothing
- End Get
- End Property
"Server.dbConnect" ist eine von mir geschriebene Klasse, die folgendermaßen aussieht:
VB.NET-Quellcode
- Imports Devart.Data.SQLite
- Public Class DatabaseConnector
- Private ConnectionString As String
- Public Sub New(ByVal connectionString As String)
- Me.ConnectionString = connectionString
- End Sub
- Function getConnection() As SQLiteConnection
- Dim dbConnect As New SQLiteConnection(ConnectionString)
- Do
- Try
- dbConnect.ConnectionTimeout = 100
- dbConnect.Open()
- Exit Do
- Catch ex As Exception
- System.Threading.Thread.Sleep(30)
- End Try
- Loop
- Return dbConnect
- End Function
- Public Function getReader(ByVal command As String) As DataTable
- Dim dbConnect As SQLiteConnection = getConnection()
- Dim da As New SQLiteDataAdapter(command, dbConnect)
- Dim dt As New DataTable()
- da.Fill(dt)
- dbConnect.Close()
- dbConnect.Dispose()
- GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced)
- Return dt
- End Function
- Public Sub execute(ByVal command As String)
- Dim dbConnect As SQLiteConnection = getConnection()
- Dim dbCommand As SQLiteCommand = dbConnect.CreateCommand
- dbCommand.CommandText = command
- dbCommand.ExecuteNonQuery()
- dbConnect.Close()
- dbConnect.Dispose()
- GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced)
- End Sub
- Public Function executeScalar(ByVal command As String) As Integer
- Dim dbConnect As SQLiteConnection = getConnection()
- Dim dbCommand As SQLiteCommand = dbConnect.CreateCommand
- dbCommand.CommandText = command
- Dim i As Integer = dbCommand.ExecuteScalar
- dbConnect.Close()
- dbConnect.Dispose()
- GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced)
- Return i
- End Function
- End Class
Wie man in meiner Klasse sieht, habe ich schon versucht, den Garbage-Collector manuell anzustoßen (wenn das überhaupt der richtige Befehl ist)
Ich bin bei der Programmierung davon ausgegangen, das Objekte wie die SQLite-Connection am Ende der Sub, die ihn enthält, "zum Abschuss freigegeben" werden und dann aus dem RAM entfernt werden. Dasselbe habe ich für die Funktionen angenommen, die die Propertys aufrufen. Deren Subs dauern im Maximalfall 10 Sekunden, nach denen die in der Property erstellten Objekte nicht mehr aufrufbar sind und dementsprechend gelöscht werden können.
Der Server läuft mit mono-sgen auf einem Debian 8-System.
Nun ist die Frage: Was mache ich falsch? Wie kann ich diese RAM-Flutung beheben oder verringern?
Mit hoffenden Grüßen,
Nico