隠された例外(その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:xx  oracle.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が失敗しているようだが、パラメタのバインドが上手くいっていないのかな。しかし、この実装はまずいなぁ。