2011-12-17 69 views
1

我正在使用H2 database 1.3.162和OpenJPA 2.1.1針對用Java編寫的小型桌面應用程序。org.apache.openjpa.lib.jdbc.ReportingSQLException:連接中斷:「會話關閉」

出於某種原因,我在隨機的我的代碼的地方得到以下異常。

Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: Connection is broken: "session closed" [90067-162] {SELECT COUNT(t0.id) FROM Visitor t0 WHERE (t0.EngineId = ?)} [code=90067, state=90067] 
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:281) 
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:261) 
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:72) 
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:313) 
    at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:155) 
    at org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:158) 
    at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:155) 
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$RefCountConnection.prepareStatement(JDBCStoreManager.java:1653) 
    at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:144) 
    at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:561) 
    at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:541) 
    at org.apache.openjpa.jdbc.sql.SelectImpl.prepareStatement(SelectImpl.java:479) 
    at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:420) 
    at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:391) 
    at org.apache.openjpa.jdbc.sql.LogicalUnion$UnionSelect.execute(LogicalUnion.java:427) 
    at org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:230) 
    at org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:220) 
    at org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.open(SelectResultObjectProvider.java:94) 
    at org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.open(QueryImpl.java:2070) 
    at org.apache.openjpa.kernel.QueryImpl.singleResult(QueryImpl.java:1320) 
    at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1242) 
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1007) 

persistence.xml很簡單,沒有什麼特別的真

<persistence-unit name="openjpa" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <class>com.mine.reporting.data.IpInfo</class> 
    <properties> 
     <property name="openjpa.ConnectionURL" value="jdbc:h2:database"/> 
     <property name="openjpa.ConnectionDriverName" value="org.h2.Driver"/> 
     <property name="openjpa.jdbc.DBDictionary" value="org.apache.openjpa.jdbc.sql.H2Dictionary"/> 

     <property name="openjpa.ConnectionUserName" value="sa"/> 
     <property name="openjpa.ConnectionPassword" value=""/> 
     <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/> 
     <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> 
    </properties> 
</persistence-unit> 

但一切工作正常,如果我有EclipseLink(前的TopLink)代替OpenJPA的這使我得出結論的問題是OpenJPA中。

我在做什麼不對?

+1

我不知道爲什麼會話已關閉,但您應該考慮使用不同的數據庫URL。您使用的那個表示數據庫文件相對於當前工作目錄存儲,這有點危險。我建議使用絕對路徑('jdbc:h2:/ data/db'),或相對於當前用戶主目錄('jdbc:h2:〜/ data/db') –

回答

2

嘗試設置openjpa.ConnectionRetainMode=always。這將告訴OpenJPA每個EM獲得一個連接並保留它。這可能會使問題消失,但它不能解決爲什麼你的連接看起來不好的根本問題。

我相信在2.1.1上OpenJPA會將DBCP作爲JPA和數據庫之間的連接池插入,也許在檢測到不良連接時會出現問題。

+0

原來它是由當SwingWorker在另一個線程中使用EntityManager時,在主線程中連接被關閉的事實:)所以''幫助。但是你的建議幫助我修復了另一個bug。謝謝! – expert