隠された例外(その2)
Java 6u7のCachedRowSet実装でacceptChangesを呼ぶと、以下のように例外が出るがよく判らない。
Caused by: javax.sql.rowset.spi.SyncProviderException: 3同期中に競合が発生します。 at com.sun.rowset.internal.CachedRowSetWriter.writeData(CachedRowSetWriter.java:386) at com.sun.rowset.CachedRowSetImpl.acceptChanges(CachedRowSetImpl.java:859) at com.sun.rowset.CachedRowSetImpl.acceptChanges(CachedRowSetImpl.java:918)
以上、一昨日のエントリより。
やはり例外は隠れていた。
JDBCドライバはトレースを採取できるものが多いが、使用しているoracle jdbc thinドライバも例外ではない。適切な設定により殆どのAPIのトレースを採取できる。
Oracle Database JDBC開発者ガイドおよびリファレンス11gリリース1(11.1)30 JDBCの診断機能
以下は、問題のSyncProviderExceptionが発生したと思われる時のログだ(出力にはlog4j風にフォーマットするFormatterの実装を使っている)
2008/08/14 xx:xx:xxoracle.jdbc.driver.SensitiveScrollableResultSet [next] Public Enter: 2008/08/14 xx:xx:xx oracle.jdbc.driver.SensitiveScrollableResultSet [next] return: true 2008/08/14 xx:xx:xx oracle.jdbc.driver.SensitiveScrollableResultSet [next] Exit 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Public Enter: 1, "Kazzz" 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Exit 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Public Enter: 2, "Japan" 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Exit 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Public Enter: 3, "kazzz@.co.jp" 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Exit 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Public Enter: 4, "0" 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Exit 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Public Enter: 5, "1" 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Exit 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Public Enter: 6, 2008-08-14 xx:xx:xx.101 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [setObject] Exit 2008/08/14 xx:xx:xx oracle.jdbc.driver.OraclePreparedStatement [executeUpdate] Public Enter: 2008/08/14 xx:xx:xx oracle.jdbc.driver.OracleStatement [doExecuteWithTimeout] SQL: INSERT INTO ADDBOOK ORDER BY FULLNAME (FULLNAME, ADDRESS, EMAIL, MARRIED, GENDER, UPDDATE) VALUES (?, ?, ?, ?, ?, ?) 2008/08/14 xx:xx:xx oracle.jdbc.driver.T4CTTIoer [processError] Throwing SQLException: ORA-00926: VALUESキーワードがありません。
やはりSQLExceptionが隠れていた。INSERTが失敗しているようだが、パラメタのバインドが上手くいっていないのかな。しかし、この実装はまずいなぁ。