私は次のかなり奇妙な動作をしています:
フェッチャーは、データベースからかなり多数のクエリを実行し、PreparedStatement
クエリ間でデータベース接続を開いたままにする を使用します。アプリケーション全体は、メイン メソッドから起動するか、Tomcat にデプロイしてから Web アプリ経由でトリガーできます (実行されるコードはどちらの場合も同じままです)。
main-mamethod によるローカル実行では期待どおりのデータが得られますが、tomcat による実行ではそうではありません。エラーを次のように突き止めました。
/* Statement is a PreparedStatement which is initialized at
* the start of the execution and reused until the execution
* is completed */
ResultSet rs = stmt.executeQuery();
/* Commenting out this line gives me correct data in tomcat
* and main method, leaving it in corrupts data only in tomcat */
rs.setFetchSize(2000);
while (rs.next) {
doStuff(rs);
}
rs.close();
なぜ私がここで困惑したのか理解できるかもしれません。ResultSet.setFetchSize()
使用後に結果セットが閉じられている場合でも、コードの正確性に影響を与えるのはなぜですか? また、Tomcat で実行した場合にのみ破損するのはなぜですか?
編集
データベースから選択された列がデータベース内のデータと一致しません。つまり、データベースには、識別子とその識別子の有効期限の 2 つのキー列があります。1 つの行からフェッチされたデータ列を sqldeveloper によって提供されたデータと一致させると、それらは一致しません。
例: SQL 開発者は、次の行を期待するように指示します。
ID | VALIDITY | HOUR_1 | HOUR_2 |...
------+------------+--------+--------+...
1897 | 01.01.2013 | 100000 | 100000 |...
それでも私は取り戻す
ID | VALIDITY | HOUR_1 | HOUR_2 |...
------+------------+--------+--------+...
1897 | 01.01.2013 | 14000 | 14000 |...
興味深いことに、一部の列は正しくフェッチされています。1 つの例では 365 行が取得され、最初の 10 行は正しく (10 は Oracle のデフォルトの fetchSize - 偶然ですか?)、次の 355 行は間違っています。
OracleResultSet
また、フェッチサイズの設定が実際の結果サイズよりも大きい場合、SQLExceptionがスローされることがjavadocに示されているため、フェッチサイズをまったく設定することは最良のアイデアではない可能性があるというヒントも見つかりました。ただし、静かに間違ったデータだけで例外は発生しません。