2013-06-18 62 views
1

我想問你以下問題的幫助。我有方法:提交期間的延遲(使用JPA/JTA)

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; 
+0

嗨Ondrej,你試過這個:em.getTransaction()。begin(); //你的代碼; em.getTransaction()提交();正如我所建議的?我認爲這將工作...讓我知道 – Paolof76

+0

嘿,我試過兩種可能性,但問題是在EntityManager和事務 - >我被禁止使用getTransaction()並操縱它,因爲它是容器管理的事務。我現在正在調查OpenJPA設置中的一些屬性。 – holmicz

回答

0

使用明確的事務提交:

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

這應該工作。執行.begin()和.end()之間的所有操作的時間當然也取決於您正在執行的循環,插入的行數,數據庫的位置(網絡的速度事情)等等...