我正在使用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