Hallo,
ich habe wieder ein Problemchen mit der RAM Auslastung bei Datenbankzugriffen,
unzwar um es genauer zu sagen mit dem ResultSet.
In meinem letzten Post zu diesem Thema war das Problem das ich die ResultSets nicht immer geschlossen habe. Leuchtet mir auch ein.
In unserem Programm gibt es die Möglichkeit direkt auf ganze Datenbanktabellen zuzugreifen um ggf. eine Änderung vornehmen zu können (Nur die Daten!). Dies ist immer sehr sinnvoll für uns wenn die Datenbank auf irgendwelchen Servern von Rechenezentren liegt und man 30 Seiten Papier ausfüllen muss damit man an seiner eigenen Datenbank was verändern darf, und da aus Sicherheitsgründen nicht jeder Arbeitsplatz eine eigene Workbench / Management Studio / SQL Developer (je nachdem welches DB-System dort läuft) hat, ist dies der beste Weg für uns die Daten schnell & bequem zu ändern.
Nun in der Regel sieht das dann so aus das ich mir über diesen Service-Bereich im Programm einen Datensatz selektiere und diesen dann anpasse oder auch einfach einen neuen hinzufüge,
einen lösche etc.
Nun nach einigen Spielereien habe ich einfach mal ein "select *" ausgeführt auf eine Tabelle in welcher ~ 70MB Daten liegen (190.000 Datensätze á 64 Spalten).
RAM Auslastung für das Programm:
Nach Start: 125 MB
Resultset öffnen 1: 1384 MB
Resultset schließen 1: 1382 MB
Resultset öffnen 2: 1789 MB
Resultset schließen 2: 1779 MB
Nungut,
1. Ich habe immer gedacht das das ResultSet eine Art Pointer ist welcher auf die Daten in der Datenbank zeigt, aber wenn ich das sehe, dann speichert das ResultSet sich ja alle Daten ab.. oder wie kommt es zu dieser Menge an RAM die da verpulvert wird?
2. Nachdem ich das Resultset geschlossen habe, bleibt der RAM Verbrauch im TaskManager so gut wie stehen. Da bin ich davon ausgegangen das Java den RAM zwar für sich Beansprucht hat, aber das es auch sein kann das von diesen 1382 MB nur 200 MB zur Zeit benötigt werden. Es gab mal einen Zeitpunkt an dem Java die 1382 MB benötigt hat, hat diesen Speicher auch wieder freigegeben, aber behält sich diesen dennoch im Hinterkopf falls er mal wieder benötigt wird, aber das erklärt dann nicht das erneute öffnen eines ResultSets, da der RAM hier wieder total explodiert.
3. Ich habe Testweise mal ein System.gc() nach dem close von dem ResultSet gemacht, aber hierbei verändert sich leider garnichts.
Also für mich ist Punkt 1 am wenigsten zu verstehen. Selbst wenn ich mir alle meine Daten aus der Tabelle in ein 2 Dimensionales String Array speichere, verbrauche ich bei weitem nicht soviel RAM wie das ResultSet beim öffnen.
Bevor nun jemand sagt "Aber man macht auch kein 'select *'" .. ja, aber dadurch werde ich an dieser Stelle auch nicht klüger
Ich steh mit dem ResultSet echt auf Kriegsfuß. Irgendwo verstehen wir uns einfach nicht^^
Danke
ich habe wieder ein Problemchen mit der RAM Auslastung bei Datenbankzugriffen,
unzwar um es genauer zu sagen mit dem ResultSet.
In meinem letzten Post zu diesem Thema war das Problem das ich die ResultSets nicht immer geschlossen habe. Leuchtet mir auch ein.
In unserem Programm gibt es die Möglichkeit direkt auf ganze Datenbanktabellen zuzugreifen um ggf. eine Änderung vornehmen zu können (Nur die Daten!). Dies ist immer sehr sinnvoll für uns wenn die Datenbank auf irgendwelchen Servern von Rechenezentren liegt und man 30 Seiten Papier ausfüllen muss damit man an seiner eigenen Datenbank was verändern darf, und da aus Sicherheitsgründen nicht jeder Arbeitsplatz eine eigene Workbench / Management Studio / SQL Developer (je nachdem welches DB-System dort läuft) hat, ist dies der beste Weg für uns die Daten schnell & bequem zu ändern.
Nun in der Regel sieht das dann so aus das ich mir über diesen Service-Bereich im Programm einen Datensatz selektiere und diesen dann anpasse oder auch einfach einen neuen hinzufüge,
einen lösche etc.
Nun nach einigen Spielereien habe ich einfach mal ein "select *" ausgeführt auf eine Tabelle in welcher ~ 70MB Daten liegen (190.000 Datensätze á 64 Spalten).
RAM Auslastung für das Programm:
Nach Start: 125 MB
Resultset öffnen 1: 1384 MB
Resultset schließen 1: 1382 MB
Resultset öffnen 2: 1789 MB
Resultset schließen 2: 1779 MB
Nungut,
1. Ich habe immer gedacht das das ResultSet eine Art Pointer ist welcher auf die Daten in der Datenbank zeigt, aber wenn ich das sehe, dann speichert das ResultSet sich ja alle Daten ab.. oder wie kommt es zu dieser Menge an RAM die da verpulvert wird?
2. Nachdem ich das Resultset geschlossen habe, bleibt der RAM Verbrauch im TaskManager so gut wie stehen. Da bin ich davon ausgegangen das Java den RAM zwar für sich Beansprucht hat, aber das es auch sein kann das von diesen 1382 MB nur 200 MB zur Zeit benötigt werden. Es gab mal einen Zeitpunkt an dem Java die 1382 MB benötigt hat, hat diesen Speicher auch wieder freigegeben, aber behält sich diesen dennoch im Hinterkopf falls er mal wieder benötigt wird, aber das erklärt dann nicht das erneute öffnen eines ResultSets, da der RAM hier wieder total explodiert.
3. Ich habe Testweise mal ein System.gc() nach dem close von dem ResultSet gemacht, aber hierbei verändert sich leider garnichts.
Also für mich ist Punkt 1 am wenigsten zu verstehen. Selbst wenn ich mir alle meine Daten aus der Tabelle in ein 2 Dimensionales String Array speichere, verbrauche ich bei weitem nicht soviel RAM wie das ResultSet beim öffnen.
Bevor nun jemand sagt "Aber man macht auch kein 'select *'" .. ja, aber dadurch werde ich an dieser Stelle auch nicht klüger
Ich steh mit dem ResultSet echt auf Kriegsfuß. Irgendwo verstehen wir uns einfach nicht^^
Danke