|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
|
[Java] Problema transazioni
Salve gente,
Ho un problema con un progetto che sto realizzando. Il programma dovrebbe scaricare un file XML di circa 7Mb da internet, contenente tutti i programmi che vanno in onda su S*y da oggi ai prossimi 7 giorni. Poi dovrebbe parsarlo e inserire i dati nel database (sono circa 27'000 records). Ovviamente per inserire 27'000 records l'uso delle transazioni è ovvio. Il problema è che non appena faccio partire il programma, lui scarica il file da internet (e fin lì non ha problemi), poi non appena inizia con il parsing, la CPU sale (ovviamente) e la RAM sale costantemente fino a raggiungere un errore "java.lang.OutOfMemoryError: Java heap space". Prima di far partire il programma la RAM occupata è circa 530Mb. Facendo partire il programma sale fino a circa 1Gb, dopodiché dà errore (perché ho 1Gb di RAM). Il processo che occupa la RAM è mysql. Ora, con le transazioni le query vengono salvate in memoria e inserite nel db non appena riceve il "commit". Ma com'è possibile che le transazioni occupano 500Mb di memoria quando il file prima di essere parsato è solo 7Mb?? Vi allego una parte di codice che magari potrebbe aiutarvi.. Codice:
public class Main { public static Palimpsest palimpsest; public static Connection db; protected static String db_username = "username"; protected static String db_password = ""; public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/database", Main.db_username , Main.db_password); db.setAutoCommit(false); palimpsest = new Palimpsest(); palimpsest.updateDays(); db.commit(); db.close(); } catch (Exception e) { e.printStackTrace (); } }
Qualcuno può aiutarmi? Grazie, sato Ultima modifica di satoshi2005 : 06-04-2007 alle 14:17. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
![]() Altrimenti non mi spiego proprio come fai ad usare 500 MB di ram ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
|
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Prova a lanciare l'applicazione con -Xaprof. Del genere:
java -Xaprof pippo.Main > profile.txt nel profilo troverai un elenco delle classi create, del numero di istanze e di quanta memoria queste occupano (per categoria). Per dirla breve, alla fine vedi chi si pappa tutta 'sta memoria.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
In questi casi, da bravo pilota, mi preparo una checklist da seguire: 1 - Hai provato a fare il commit() record per record e vedere cosa succede? Facendo una sola commit(), probabilmente l'area di rollback e' cresciuta un pochino... 2 - Sei sicuro di aprire e chiudere gli Statement? Tutti gli Statement? 3 - Sei sicuro che il problema non sia il parser? Se stai usando DOM, per questa applicazione, potrebbe essere benissimo lui... 4 - Hai provato con i suggerimenti di PGI-Bis?
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
|
Quote:
1. Si, con l'autocommit si crasha lo stesso 2. Ecco cosa ho dimenticato! Ahahah 3. Com'è possibile che sia lui se la stringa più grande che gestisce è di 7Mb? 4. Devo ancora provare, ma penso che mi hai già risolto il problema! Grazie mille! Sato |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
|
Devo rifare tutto! Mi si è rotto l'hard-disk! NOOOOOOOOOOOOOOO
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
|
Ok ho rifatto tutto, il problema era appunto perché non chiudevo gli statements (e nemmeno i resultset), dunque grazie!
Ora però ho un altro problema.. Se metto: Codice:
Class.forName("com.mysql.jdbc.Driver"); db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/satoepg", Main.db_username , Main.db_password); db.setAutoCommit(false); palimpsest = new Palimpsest(); palimpsest.updateDays(); db.commit(); db.close(); Codice:
Class.forName("com.mysql.jdbc.Driver"); db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/satoepg", Main.db_username , Main.db_password); db.setAutoCommit(true); palimpsest = new Palimpsest(); palimpsest.updateDays(); db.close(); Grazie, sato edit: Vi ricordo: La connessione che usa per fare qualsiasi query è sempre la stessa (è static), quindi faccio sempre "Main.db.prepareStatement(...)" |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
![]()
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } Ultima modifica di Angus : 18-04-2007 alle 10:19. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:46.