Ho semplicemente bisogno di leggere ogni riga di una tabella nel mio database MySQL usando Hibernate e scrivere un file basato su di esso. Ma ci sono 90 milioni di file e sono piuttosto grandi. Così sembrava che quanto segue sarebbe opportuno:Utilizzo di ScrollableResults di Hibernate per leggere lentamente 90 milioni di record
ScrollableResults results = session.createQuery("SELECT person FROM Person person")
.setReadOnly(true).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
while (results.next())
storeInFile(results.get()[0]);
Il problema è quanto sopra sarà cercare di caricare tutti i 90 milioni di righe nella RAM prima di passare al ciclo while ... e che ucciderà la mia memoria con OutOfMemoryError : Java heap space exceptions :(.
Quindi penso che ScrollableResults non è quello che stavo cercando? Qual è il modo corretto per gestire questo? Non mi importa se questo ciclo richiede giorni (beh, io lo adoro)
Immagino che l'unico altro modo per gestirlo sia usare setFirstResult e setMaxResults per iterare attraverso i risultati e solo noi e risultati di Hibernate regolari invece di ScrollableResults. Sembra che sarà inefficiente e inizierà a prendere un tempo ridicolmente lungo quando chiamerò setFirstResult sull'89 millesimo di fila ...
AGGIORNAMENTO: setFirstResult/setMaxResults non funziona, si scopre di prendere un tempo insolitamente lungo per arrivare agli offset come temevo. Ci deve essere una soluzione qui! Non è una procedura abbastanza standard ?? Sono disposto a rinunciare a Hibernate e utilizzare JDBC o qualsiasi altra cosa.
UPDATE 2: la soluzione che è venuta in mente che funziona ok, non eccezionale, è sostanzialmente di forma:
select * from person where id > <offset> and <other_conditions> limit 1
Dal momento che ho altre condizioni, anche il tutto in un indice, non è ancora Veloce come vorrei essere ... quindi ancora aperto per altri suggerimenti ..
Potrebbe essere possibile suddividere i dati in modo che non sia necessario leggerli contemporaneamente, ad esempio: http://stackoverflow.com/questions/8325745/how-to-implement-several-threads-in -java-per-download-a-single-table-data/29502316 # 29502316 – rogerdpack