Hallo an alle,
ich habe anscheinend ein kleines Problem mit dem RAM, ich bekomme nml einen OutOfMemoryError (Java heap space).
Mal zur Erläuterung:
Ich lese Daten von einer mySQL-DB mit ~400.000 Datensätzen. Der DB-Server läuft lokal. Ich gehe jeden Datensatz einzeln durch und schreibe ihn in eine entfernte DB. Sobald ich einen Satz geschrieben hab, mach ich ein update auf der mySQL-DB.
Der Vorgang sieht ungefähr so aus:
Connection c1 aufbauen, autocommit(false)
Connection c2 aufbauen, autocommit(false)
ResultSet rs = SELECT auf c1 um die Daten zu holen
while(rs.next()) {
HashMap hm = getMySqlData(rs)
insertC2(hm)
updateC1(hm)
}
wenn alles korrekt abgelaufen ist: c1.commit() c2.commit() und abschließend die connections wieder schließen.
Was vielleicht noch Bedeutung sein könnte ist, dass es nicht nur ein insert ist, sondern bis zu 6.
So, jetzt geht mir laut Fehlermeldung der RAM aus. Wie könnte ich diese Abfolge umstrukturieren damit der RAM nicht so ausgelastet wird?
Meine Befürchtung und auch der Grund, warum ich alles in einem Durchlauf mache, ist, dass inkonsistente Daten entstehen könnten. Es kann ja sein, dass während meinem Batchlaufs irgendjemand anders auf die Idee kommt die Daten zu verändern (nur auf der mySQL-DB möglich) gibt es da Einstellungen um Dirty Read & Write zu unterbinden? Das ich sozusagen sage: "Du bist gesperrt bis ich fertig bin"
Ich hab mir auch ein paar andere Sachen überlegt: Das update könnte ich mit einem Schlag nach den inserts durchführen. Dann wäre mal ein großer Brocken weg (hoffe ich). Ein weiterer Punkt ist, dass ich kein ResultSet nehme sondern ein CachedRowSet oder etwas in der Art - bringt das performance mäßig was? Auch ist mein update ein eigenes PreparedStatement ... könnte ich, bzw sollte ich das update mithilfe des ResultSets machen?
Ich danke euren Gehirnzellen und Nervensträngen schon im vorraus.
LG Shoox
ich habe anscheinend ein kleines Problem mit dem RAM, ich bekomme nml einen OutOfMemoryError (Java heap space).
Mal zur Erläuterung:
Ich lese Daten von einer mySQL-DB mit ~400.000 Datensätzen. Der DB-Server läuft lokal. Ich gehe jeden Datensatz einzeln durch und schreibe ihn in eine entfernte DB. Sobald ich einen Satz geschrieben hab, mach ich ein update auf der mySQL-DB.
Der Vorgang sieht ungefähr so aus:
Connection c1 aufbauen, autocommit(false)
Connection c2 aufbauen, autocommit(false)
ResultSet rs = SELECT auf c1 um die Daten zu holen
while(rs.next()) {
HashMap hm = getMySqlData(rs)
insertC2(hm)
updateC1(hm)
}
wenn alles korrekt abgelaufen ist: c1.commit() c2.commit() und abschließend die connections wieder schließen.
Was vielleicht noch Bedeutung sein könnte ist, dass es nicht nur ein insert ist, sondern bis zu 6.
So, jetzt geht mir laut Fehlermeldung der RAM aus. Wie könnte ich diese Abfolge umstrukturieren damit der RAM nicht so ausgelastet wird?
Meine Befürchtung und auch der Grund, warum ich alles in einem Durchlauf mache, ist, dass inkonsistente Daten entstehen könnten. Es kann ja sein, dass während meinem Batchlaufs irgendjemand anders auf die Idee kommt die Daten zu verändern (nur auf der mySQL-DB möglich) gibt es da Einstellungen um Dirty Read & Write zu unterbinden? Das ich sozusagen sage: "Du bist gesperrt bis ich fertig bin"
Ich hab mir auch ein paar andere Sachen überlegt: Das update könnte ich mit einem Schlag nach den inserts durchführen. Dann wäre mal ein großer Brocken weg (hoffe ich). Ein weiterer Punkt ist, dass ich kein ResultSet nehme sondern ein CachedRowSet oder etwas in der Art - bringt das performance mäßig was? Auch ist mein update ein eigenes PreparedStatement ... könnte ich, bzw sollte ich das update mithilfe des ResultSets machen?
Ich danke euren Gehirnzellen und Nervensträngen schon im vorraus.
LG Shoox