【问题标题】:Delay during commit (using JPA/JTA)提交期间的延迟(使用 JPA/JTA)
【发布时间】:2013-06-18 08:20:37
【问题描述】:

我想就以下问题向您寻求帮助。我有方法:

String sql = "INSERT INTO table ...."
Query query = em.createNativeQuery(sql);
query.executeUpdate();
sql = "SELECT max(id) FROM ......";
query = em.createNativeQuery(sql);
Integer importId = ((BigDecimal) query.getSingleResult()).intValue();

for (EndurDealItem item : deal.getItems()) {
        String sql2 = "INSERT INTO another_table";
        em.createNativeQuery(sql2).executeUpdate();
    }

在执行之后,数据不会被提交(大约需要 10 或 15 分钟才能提交数据)。有什么方法可以显式提交数据或触发提交?是什么原因导致交易在这么长时间内保持未提交状态?

我们使用 nativeQueries 的原因是,我们在某个共享接口上导出数据,并且我们不再使用这些数据。

我想提一下,该事务是由容器管理的(由 Geronimo 提供)。 EntityManager 是通过链接创建的:

 @PersistenceContext(unitName = "XXXX", type = PersistenceContextType.TRANSACTION)
 private EntityManager em;

【问题讨论】:

  • 嗨 Ondrej,你试过这个吗:em.getTransaction().begin();//你的代码; em.getTransaction().commit();正如我建议的那样?我认为这会奏效......让我知道
  • 嘿,我尝试了两种可能性,但问题出在 EntityManager 和 Transactions -> 我被禁止使用 getTransaction() 并对其进行操作,因为它是容器管理的事务。我现在正在调查 OpenJPA 设置中的一些属性。

标签: java oracle jpa jta geronimo


【解决方案1】:

明确使用事务提交:

EntityManager em = /* get an entity manager */;
em.getTransaction().begin();
// make some changes
em.getTransaction().commit();

这应该可行。 .begin() 和 .end() 之间所有操作的执行时间当然也取决于您执行的周期、您插入的行数、数据库的位置(网络的速度事情)等等......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    相关资源
    最近更新 更多