Jump to content
Tom Next - Daytrading Community
  • entries
    49
  • comments
    105
  • views
    104,197

MemoryLeaks in Java...


Mythos

1,777 views

Hi there,

 

es gibt sie doch! Egal was man euch in der Schule erzählt hat, man kann in Java Speicherlöcher erzeugen! GC hin oder her.

Im konkreten Fall durch Verwendung des JConnectors für MySQL. Wie? ganz einfach: hol dir eine Connection, lass ein stmt erzeugen (für die übereifrigen auch ein rs) und verwirf die referenz drauf ohne es zu schließen.

Vor allem ein gemeiner Fehler wenn man an sich jeden Datenbankzugriff in einer schönen Methode kapselt und bei diesen Methoden der Body immer mit einem try-catch ummantelt ist, in dessen finally result, statement und connection geschlossen werden.

Weil wenn man dann in der Entwicklung mal eine Abfrage hat, die aus mehr als einer Abfrage besteht (zB für die Accountinfo die Userinfo aus der einen Tabelle und die Positioninfo aus der anderen) und sich denkt das es eigentlich Sinn macht das in einer Methdoe zusammen zu lassen (weils ja eigentlich von außen eine Abfrage is), dann darf man halt auch nicht vergessen zwischendrin das result und statement zu schließen bevor man es neu zuweist... weil das merkt weder der Compiler noch gibt es unerwartetes Verhalten. Auch im Profiler fällts nicht direkt auf wenn man nicht weiss wonach man sucht (es werden soviele andere Objekte erzeugt etc...) Nur wenn man das Ding ein paar Stunden laufen lässt und regelmäßig diese Methode aufgerufen wird (so alle paar Sekunden) bläst sich schön gemütlich der RAM auf...

 

Wenn das ganze dann auch noch in einer Server Applikation steckt die sowieso schon soviele Punkte enthält die man noch nit 100% versteht, macht die Fehlersuche noch mehr Spass ;)

 

So, genug ausgeschimpft.

Ne doch nicht: für alle die sich auch mal so ein Client/Server ding bauen wollen: Es gibt deutlich unterschiedliches Verhalten zwischen lokal und übers Netz. So krieg ich am VPS am Ende immer ein EndOfStream (wie erwartet), lokal hab ichs nie gekriegt (nur ein Timeout im versuch Daten zu lesen...).

 

Zusammenfassend: Der Alphatest am Server läuft. Mal sehen wie langs bis zum Betatest dauert. Ich lern täglich Unmengen über Serververhalten dazu und weiß inzwischen warum solche Projekte normal keiner allein macht... Aber mei, Hauptsache Spass an der Freude ;)

 

no worries

mythos

3 Comments


Recommended Comments

Javadoc ist immer zu empfehlen ... http://download.oracle.com/javase/6/docs/api/java/sql/Statement.html

 

public interface Statement
extends Wrapper

The object used for executing a static SQL statement and returning the results it produces.

By default, only one ResultSet object per Statement object can be open at the same time. Therefore,
if the reading of one ResultSet object is interleaved with the reading of another, each must have been 
generated by different Statement objects. All execution methods in the Statement interface implicitly 
close a statment's current ResultSet object if an open one exists.

Link to comment

Als Anreiz noch für Dich. Es gibt auch fertige Frameworks, welche Dir diese Arbeit abnehmen.

Spring bspw. bietet ein JDBC-Template an, oder als Alternative kann ich JPA (Java Persistence API)

empfehlen. Hier kannst Du das OR-Mapping komplett auf Objekt-Ebene mit Annotationen gestalten.

SQL wird Dir dann aus Deinen Angaben generiert. Dabei kannst Du aber immer noch direktes SQL

verwenden, um so möglichst tief einzugreifen, wenn Du etwas spezielle benötigst.

 

Beste Grüße

DT

Link to comment
×
×
  • Create New...