我正在使用STS + Grails 1.3.7併爲數千個域類實例進行批量插入。Grails/Hibernate批量插入
這很慢,因爲Hibernate只是將所有SQL語句批量化爲一個JDBC調用,而不是將這些語句合併爲一個。
我怎樣才能讓它們成爲一個大的聲明?
我正在使用STS + Grails 1.3.7併爲數千個域類實例進行批量插入。Grails/Hibernate批量插入
這很慢,因爲Hibernate只是將所有SQL語句批量化爲一個JDBC調用,而不是將這些語句合併爲一個。
我怎樣才能讓它們成爲一個大的聲明?
你可以看到這行Hibernate的文檔:當我改變發電機的類型
Hibernate disables insert batching at the JDBC level transparently if you use an identity identifier generator.
,它的工作。
你可以做的是沖洗Hibernate的Session每20插入這樣的:
int cpt = 0
mycollection.each{
cpt ++
if(cpt > 20){
mycollection.save(flush:true)
}
else{
mycollection.save()
}
}
hbernate會議的沖洗執行SQL語句每20個插入。 這是最簡單的方法,但您可以在Tomas lin博客中找到更多interent的方法。他正在準確地解釋你想要做什麼:http://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/
在域類上使用withTransaction()
方法可以使批處理腳本的插入快得多。您可以在一個集合中構建所有域對象,然後將它們插入到一個塊中。
例如:
Player.withTransaction{
for (p in players) {
p.save()
}
}
謝謝傑森。我試過這個,但它不起作用。 – user571470 2011-02-28 20:48:12
你可以發佈你插入的代碼嗎? – 2011-02-27 15:02:16