【发布时间】:2013-11-13 21:42:12
【问题描述】:
我正在使用 Spring Data 和 Apache Camel 进行项目,我们有 2 个数据库,Sql Server 和 Oracle 以及 JTA。出现问题是因为我需要从一个大文件(大约 10000000 条记录)中插入数据,所以我决定使用批量插入作为:
@PersistenceContext(unitName="persistenceUnitSql")
EntityManager em;
public void insertBatch() {
em.getTransaction().begin();
for (int i = 1; i <= 1000000; i++) {
Point point = new Point(i, i);
em.persist(point);
if ((i % 10000) == 0) {
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
}
}
em.getTransaction().commit();
}
但是这个问题发生了:
A JTA EntityManager cannot use getTransaction()
任何帮助...
【问题讨论】:
-
为什么需要多笔交易?通常,
flush后跟clear就足够了。然后简单地用@Transactional标记insertBatch方法,你应该会很好。或者甚至更好地使用 Spring Batch 而不是滚动您自己的批处理解决方案...... -
我们正在使用带有2个数据库的spring数据,负责对对象进行持久化的类扩展自CrudRepository。此类具有同时插入单个记录的方法。我必须使用 apache camel 从 txt 文件中读取每一行,然后将这一行插入数据库。对于大文件 (300MB),该过程需要很长时间。
-
既然可以使用弹簧批,为什么还要自己动手做呢?但正如提到的
flush和clear以及一般工作中的单个事务。对于一般的 JTA,尤其是在具有多个事务资源的情况下,希望使用容器管理的事务而不是自己做。
标签: spring apache-camel spring-data batch-processing entitymanager