2011-12-17 4 views
1

Java로 작성된 작은 데스크탑 응용 프로그램의 경우 H2 database 1.3.162와 OpenJPA 2.1.1을 사용하고 있습니다.org.apache.openjpa.lib.jdbc.ReportingSQLException : 연결이 끊어졌습니다 : "세션이 닫혔습니다"

내 코드의 임의의 위치에서 다음과 같은 예외가 발생합니다. 내 persistence.xml

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-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 당 하나의 연결을 확보 할 수 있습니다. 이렇게하면 문제가 해결 될 수 있지만 연결이 왜 안 좋은지 근본적인 문제는 해결되지 않습니다.

OpenJPA가 JPA와 데이터베이스 사이의 연결 풀로 DBCP를 삽입한다고 생각합니다. 불량 연결 감지에 문제가있을 수 있습니다.

+0

'SwingWorker'가 다른 스레드에서 EntityManager를 사용하는 동안 연결이 주 스레드에서 닫히고 있다는 사실입니다. 그래서''도움이되었습니다. 그러나 당신의 제안은 다른 버그를 고치는 데 도움이되었습니다. 감사! – expert

관련 문제