2011-12-17 10 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> 

非常に単純ではありません。しかし、私は問題はOpenJPAの中にあるという結論に私をリードEclipseLink(元のTopLink)でのOpenJPAを交換した場合、すべてが正常に動作します。

私は何を正しくしませんか?

+1

セッションが閉じられた理由はわかりませんが、別のデータベースURLの使用を検討する必要があります。使用するものは、データベースファイルが現在の作業ディレクトリに対して相対的に格納されていることを意味します。これは少し危険です。現在のユーザのホームディレクトリ( 'jdbc:h2:〜/ data/db')に対して相対パス(' jdbc:h2:/ data/db')を使用することをお勧めします。 –

答えて

2

openjpa.ConnectionRetainMode=alwaysを設定してみてください。これは、OpenJPAにEMごとに1つの接続を取得し、それを保持するように指示します。これで問題は解決するかもしれませんが、接続が悪いと思われる根本的な問題は解決しません。

2.1.1 OpenJPAではJPAとデータベース間の接続プールとしてDBCPが挿入されますが、不正な接続の検出に問題があると考えられます。

+0

'SwingWorker'が別のスレッドでEntityManagerを使用している間に、メインスレッドで接続が閉じられていたという事実です:)したがって、' helped。しかし、あなたの提案は別のバグを修正するのに役立ちました。ありがとう! – expert

関連する問題