[Seasar-user:14873] S2JTA + S2Hibernate で、ConnectionPoolImpl からのコネクション取得に失敗することがある

Noriyuki Mizutani [E-MAIL ADDRESS DELETED]
2008年 6月 30日 (月) 22:33:17 JST


水谷と申します。
S2JTA + S2Hibernate の組み合わせで原因のわからない
トラブルが発生しているため、ご相談させてください。

s2container を 2.4.8 から 2.4.25 に移行したところ、
コネクション取得時に例外(トランザクションのネスト)
が発生するようになりました。
スタンドアロンのアプリケーションで、トランザクションは
S2JTA の実装を使用しており、s2hibernate 1.1.2 および
hibernate-3.1.3 を組み合わせています。

問題なく動作する s2container 2.4.8 使用時との違いは、
クラスパスへの geronimo-jta_1.1_spec-1.0.jar の追加、
TransactionSynchronizationRegistryImpl および
JTATransactionManagerAdapter のコンポーネント記述
の追加のみです。

どうもコネクションプールの maxPoolSize よりも多い
コネクション数が要求された際にはほぼ確実に起こる
ところまではわかっていますが、再現可能な最小構成を
特定するには至っておりません。

スタックトレースを付けさせていただきます。
発生する例外は3種類ありますが、同一スレッドで常に
この順番で出るようなので、後ろのふたつは副次的な
ものと思われます。

あやふやな状態での質問となってしまい恐縮ですが、
何かヒントをいただけると幸いです。

-----
Caused by: java.lang.IllegalStateException:
org.seasar.framework.exception.SXAException: [ESSR0316]ネストしたトラン
ザクションはサポートしていません
at
org.seasar.extension.jta.TransactionImpl.enlistResource(TransactionImpl.java:481)
at
org.seasar.framework.util.TransactionUtil.enlistResource(TransactionUtil.java:61)
at
org.seasar.extension.dbcp.impl.ConnectionPoolImpl.checkOut(ConnectionPoolImpl.java:317)
at
org.seasar.extension.dbcp.impl.DataSourceImpl.getConnection(DataSourceImpl.java:59)
at
org.seasar.extension.jdbc.util.DataSourceUtil.getConnection(DataSourceUtil.java:48)
at
org.seasar.hibernate3.impl.S2SessionFactoryImpl.getConnection(S2SessionFactoryImpl.java:105)
at
org.seasar.hibernate3.impl.S2SessionFactoryImpl.createSession(S2SessionFactoryImpl.java:101)
at
org.seasar.hibernate3.impl.S2SessionFactoryImpl.bindSession(S2SessionFactoryImpl.java:113)
at
org.seasar.hibernate3.impl.S2SessionFactoryImpl.getSession(S2SessionFactoryImpl.java:93)
〜中略〜
Caused by: org.seasar.framework.exception.SXAException: [ESSR0316]ネスト
したトランザクションはサポートしていません
at
org.seasar.extension.jta.xa.AbstractXAResource.assertCurrentXidNull(AbstractXAResource.java:68)
at
org.seasar.extension.jta.xa.AbstractXAResource.begin(AbstractXAResource.java:60)
at
org.seasar.extension.jta.xa.AbstractXAResource.start(AbstractXAResource.java:48)
at
org.seasar.extension.dbcp.impl.XAResourceWrapperImpl.start(XAResourceWrapperImpl.java:154)
at
org.seasar.extension.jta.TransactionImpl.enlistResource(TransactionImpl.java:476)
... 38 more

-----
org.seasar.framework.exception.SXAException: [ESSR0017]例外が発生しまし
た。理由はjava.sql.SQLException: クローズされた接続です。
at
org.seasar.extension.dbcp.impl.DBXAResourceImpl.doRollback(DBXAResourceImpl.java:87)
at
org.seasar.extension.jta.xa.AbstractXAResource.rollback(AbstractXAResource.java:267)
at
org.seasar.extension.dbcp.impl.XAResourceWrapperImpl.rollback(XAResourceWrapperImpl.java:136)
at
org.seasar.extension.jta.XAResourceWrapper.rollback(XAResourceWrapper.java:76)
at
org.seasar.extension.jta.TransactionImpl.rollbackResources(TransactionImpl.java:415)
at
org.seasar.extension.jta.TransactionImpl.rollback(TransactionImpl.java:389)
at
org.seasar.extension.jta.AbstractTransactionManagerImpl.rollback(AbstractTransactionManagerImpl.java:106)
at
org.seasar.extension.jta.UserTransactionImpl.rollback(UserTransactionImpl.java:64)
at
org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.end(JTATransactionManagerAdapter.java:175)
at
org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.required(JTATransactionManagerAdapter.java:68)
at
org.seasar.extension.tx.RequiredInterceptor.invoke(RequiredInterceptor.java:41)
〜中略〜
Caused by: java.sql.SQLException: クローズされた接続です。
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
at
oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1161)
at
org.seasar.extension.dbcp.impl.DBXAResourceImpl.doRollback(DBXAResourceImpl.java:84)
... 33 more

-----
Caused by: org.hibernate.exception.GenericJDBCException: could not
inspect JDBC autocommit mode
at
org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
at
org.hibernate.jdbc.JDBCContext.afterNontransactionalQuery(JDBCContext.java:232)
at org.hibernate.impl.SessionImpl.afterOperation(SessionImpl.java:412)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1541)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
〜中略〜
Caused by: org.seasar.framework.exception.SSQLException: [ESSR0062]コネ
クションは既に閉じています
at
org.seasar.extension.dbcp.impl.ConnectionWrapperImpl.assertOpened(ConnectionWrapperImpl.java:141)
at
org.seasar.extension.dbcp.impl.ConnectionWrapperImpl.getAutoCommit(ConnectionWrapperImpl.java:341)
at
org.hibernate.jdbc.ConnectionManager.isAutoCommit(ConnectionManager.java:185)
at
org.hibernate.jdbc.JDBCContext.afterNontransactionalQuery(JDBCContext.java:223)



Seasar-user メーリングリストの案内