我正在开发一个play 1.2.4项目,我有4个作业间隔运行,从大量数据(从webservice)获取并将它们保存到数据库。
我目前的批量插入方法是这样的:
org.hibernate.Session session =
(org.hibernate.Session)MyEntityModel.em().getDelegate();
Transaction tx = session.beginTransaction();
int i = 0;
for(Sales obj:sales)
{
convertToModelAndSave(obj);
i++;
if(i%100==0)
{
tx.commit();
session.flush();
session.clear();
tx=session.beginTransaction();
}
}
session.disconnect();
我只是在工作完成后断开会话。
我想知道这对我来说是否足够,我是否真的需要断开会话(这使我在程序中有例外)。断开连接后我的数据库连接池是否会被释放?
答案 0 :(得分:1)
另一种方法是将你的工作分成两份工作。
然后你的第一个工作调用第二个工作,你不必在你的代码中放入与hibernate相关的代码。
另一个优点:如果您在保存100个项目时进行回滚,那么您的主要作业可以通过在这种情况下逐个保存项目来重试,以避免因错误而丢失100个项目
在这种情况下,您也可以并行启动多个子作业以加快速度