2014-01-29 66 views
1

在WebSphere 7上運行OpenJPA 1.2.3應用程序,出於某些原因,我們無法在此處使用依賴注入實體管理器。所以我們在提交/回滾事務後手動管理它們並關閉它們。最近我發現致電EntityManager.close()需要相當長的時間(約佔整個操作的10%,涉及裝載約500個實體)。它所做的是分離事務中加載的所有實體。 所以其實有2個問題:OpenJPA:分離EntityManager.close()上的所有實體

  1. 爲什麼一般我們需要分離的實體管理器關閉所有實體?是否因爲JPA必須檢查所有實體是否髒?
  2. 因爲在某些情況下,實體被加載爲只讀訪問 - 是否有可能以某種方式告訴OpenJPA這些實體不應該被更新,並且不需要將它們標記爲髒,更新到DB等。

添加我的persistence.xml的要求:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
    version="1.0"> 
    <persistence-unit name="DocumentUnit" transaction-type="JTA"> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
     <class>ru.mypackage.Document</class> 
     <class>ru.mypackage.DocParam</class> 
     <class>ru.mypackage.DocParamPK</class> 
     <!-- Some more classes --> 
     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
     </properties> 
    </persistence-unit> 
</persistence> 

回答

1

爲什麼一般我們需要分離的實體管理器關閉所有實體?是否因爲JPA必須檢查所有實體是否髒?

行爲根據JPA規範定義。有點簡單的故事是,當一個實體被管理時,它與一個給定的EntityManager相關聯。如果/當您關閉該EntityManager時,您必須告訴每個受管實體它的Manager現在已關閉。這應該是一個相當輕量級的操作,但我在實踐中發現並非總是如此。原因是OpenJPA插入一個數據結構來追蹤一個實體的不潔性,而不再被追蹤。這適用於您可能將這些分離的實體之一合併回另一個持久性上下文(EntityManager)的情況。

因爲在某些情況下,實體加載只讀訪問 - 是它可能以某種方式告訴OpenJPA的是,這些機構不應該被更新,就沒有必要將它們標記爲髒,更新數據庫等。?

是和否。有一個feature, LiteAutoDetach that was added in OpenJPA 2.0.0,這將使分離過程輕得多。缺點是,如果您想要將其中一個分離的實體合併回持久性上下文中,您將放棄某些性能/功能。

我建議你分析EntityManager.close()操作,看看大部分時間都花在哪裏。您可能正在使用某些其他導致此性能問題的OpenJPA功能。

對於咧嘴笑,你可以用你的persistence.xml文件的內容更新帖子嗎?

+0

添加我的persistence.xml到帖子,但不認爲它會幫助 - 它很簡單。 無論如何,我接受的答案,因爲它是一個更理論的問題... 我已經剖析了EntityManager.close(),基本上這就是這個問題的原因)大部分時間花在分離所有已知實體(do不記得確切的方法名稱雖然()。 無論如何,這是另一個遷移到JPA 2.0 ASAP的原因。 –

相關問題