[Seasar-user:15591] [S2JDBC]イテレーション検索中にSQL文を発行し次のイテレーションに移るときSQLRuntimeExceptionが発生します

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2008年 9月 1日 (月) 17:31:32 JST


松本と申します。

お世話になります。

Oracle9i上でS2JDBCを使い
イテレーション検索を行いながら複数(5個以上)の表にインサートするバッチプログラムを開発しております
(インサートする表のエンティティには@GenarateValueアノテーションを付与しており、strategyはAUTOです)

S2JDBCのバージョンは2.4.28
jdbcドライバのバージョンは1.6.0(ojdbc6.jar)

S2JDBCのイテレーション検索を行いながらがら
select/insert/update文を10種類実行すると、イテレーション検索がSQLRuntimeExceptionで終了しまいます。
ソースを追ったところ、イテレーション検索中のSQL文実行により、
イテレーション検索のstatementCacheが捨てられ、statementがクローズされことが原因のようです。
(jdbcManagerをキャストして、jdbcContextImplのsetPrepeardStatementCacheSize(100)で実行したところ正常動作するようになりました。)

イテレーション検索中のstatementCacheは捨てないようにするか、イテレーション検索のstatementCacheを通常のstatementCacheと
分離するなどの対応が必要に感じました。
それとも別な回避方法はありますでしょうか?

また、JdbcContextImplの各StatementCacheSizeをdiconから設定する方法がありましたら教えてください。

よろしくお願いいたします。

※発生する例外
org.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[], Message=[クローズされた文です。: next], ErrorCode=17009, SQLState=99999)が発生しました
 at org.seasar.extension.jdbc.query.AbstractQuery.handleResultSet(AbstractQuery.java:443)
 at org.seasar.extension.jdbc.query.AbstractSelect.iterateInternal(AbstractSelect.java:261)
 at org.seasar.extension.jdbc.query.AbstractSelect.iterate(AbstractSelect.java:182)
 at S2JDBCTest.testTx(S2JDBCTest.java:73)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at junit.framework.TestCase.runTest(TestCase.java:164)
 at org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:519)
 at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:103)
 at org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:308)
 at junit.framework.TestResult$1.protect(TestResult.java:106)
 at junit.framework.TestResult.runProtected(TestResult.java:124)
 at junit.framework.TestResult.run(TestResult.java:109)
 at junit.framework.TestCase.run(TestCase.java:120)
 at junit.framework.TestSuite.runTest(TestSuite.java:230)
 at junit.framework.TestSuite.run(TestSuite.java:225)
 at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.SQLException: クローズされた文です。: next
 at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:120)
 at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:118)
 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:224)
 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:296)
 at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:432)
 at org.seasar.extension.jdbc.handler.BeanIterationAutoResultSetHandler.handle(BeanIterationAutoResultSetHandler.java:71)
 at org.seasar.extension.jdbc.query.AbstractQuery.handleResultSet(AbstractQuery.java:441)
 ... 23 more

 


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