Grails / Hibernate Пакетная Вставка - PullRequest
0 голосов
/ 26 февраля 2011

Я использую STS + Grails 1.3.7 и выполняю пакетную вставку для тысяч экземпляров класса домена.

Это очень медленно, потому что Hibernate просто пакетирует все операторы SQL в один вызов JDBC вместо объединенияутверждения в одно.

Как я могу превратить их в одно большое утверждение?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2011

Использование метода withTransaction() в классах домена значительно ускоряет вставку для пакетных сценариев.Вы можете собрать все доменные объекты в одну коллекцию, а затем вставить их в один блок.

Например:

Player.withTransaction{
    for (p in players) {
        p.save()
    }
}
0 голосов
/ 28 февраля 2011

Вы можете увидеть эту строку в Hibernate doc:

Hibernate disables insert batching at the JDBC level transparently if you use an identity identifier generator.

Когда я сменил тип генератора, он работал.

0 голосов
/ 28 февраля 2011

Что вы можете сделать, это сбрасывать сеанс гибернации каждые 20 вставок следующим образом:

int cpt = 0
mycollection.each{
 cpt ++
 if(cpt > 20){
  mycollection.save(flush:true)
 }
 else{
  mycollection.save()
 }
}

Сброс сеанса hbernate выполняет оператор SQL каждые 20 вставок. Это самый простой метод, но вы можете найти более интересный способ сделать это в блоге Tomas lin. Он объясняет, что именно вы хотите сделать: http://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/

...