2012-09-20 100 views
0

我正在处理大量的实体并使用休眠将其持久化到数据库。我发现开始事务需要很长时间,以防万一表中的数据量很大(整个同步过程在从Web服务获取数据需要3小时左右时花费20小时)。
有什么办法可以改善这种方法的持久性逻辑吗?JPA开始交易瓶颈

final EntityManager em = emf.createEntityManager(); 
try { 
    final MfBranch branch = <get data from web service> 
    em.getTransaction().begin(); // bottleneck 
    em.merge(branch); 
    em.getTransaction().commit(); 
} finally { 
    DisposableUtils.closeQuietly(em); 
} 

我认为合理的看到合并或事务提交操作很耗时,但为什么事务开始很耗时?

+0

是否有可能重用一个'EntityManager'而不是每次创建一个新的?也许用Spring注入它?每次可以避免使用新的开销可能会有一些开销? – millhouse

+0

你可以默认将JDBC DataSource和连接池置于autoCommit = false模式,这样可以节省一些命令。但是,如果'从Web服务获取数据'的时间不是瓶颈,数据库就是瓶颈,那么也许你应该考虑一次性在100'分支'上合并。你可能还会观察到的是你系统中的一些其他问题,这些问题涉及到由于某些其他工作与交易中的大量数据一起工作而导致的SQL事务停滞。 –

回答

3

ObjectDB中,对于大数据持久存在于JPA中的性能问题,会有参考。