这是所有hibernate应用程序的常见问题,它是由hibernate会话的增长引起的。我猜想grails控制台会为您打开一个hibernate会话,其方式类似于我知道它用于普通Web请求的“视图中打开会话”模式。
解决方案是掌握当前会话,并在每次批处理后清除它。我不确定如何使用控制台来获取spring
bean,通常对于控制器或服务,只需将它们声明为成员即可。然后,您可以使用获取当前会话
sessionFactory.getCurrentSession()。为了清除它,只需调用
session.clear(),或者
session.evict(Object)对每个
Person对象有选择地使用。
对于控制器/服务:
class FooController { def sessionFactory def doStuff = { List batch = new ArrayList() for (each person in legacy phone book) { // Construct new Grails domain class from legacy phone book person Person person = new Person(...) batch.add(person) if (batch.size() > 500) { Person.withTransaction { for (Person p: batch) p.save() batch.clear() } // clear session here. sessionFactory.getCurrentSession().clear(); } } // Save any remaining for (Person p: batch) p.save() } }}希望这可以帮助。



