我有以下相当奇怪的行为:
提取器从数据库执行相当多的查询,并使用PreparedStatement
保持数据库连接在查询之间打开的 a 。整个应用程序既可以从 main 方法启动,也可以部署在 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中执行时才会出现腐败?
编辑
从数据库中选择的列与数据库中的数据不匹配,即在数据库中有两个关键列,一个鉴别器和该鉴别器的有效日期。如果我将一行中提取的数据列与 sqldeveloper 给出的数据相匹配,则它们不匹配。
示例:SQL-Developer 告诉我期待以下行:
ID | VALIDITY | HOUR_1 | HOUR_2 |...
------+------------+--------+--------+...
1897 | 01.01.2013 | 100000 | 100000 |...
然而我找回
ID | VALIDITY | HOUR_1 | HOUR_2 |...
------+------------+--------+--------+...
1897 | 01.01.2013 | 14000 | 14000 |...
有趣的是,某些列被正确提取,在一个示例中检索了 365 行,前 10 行是正确的(10 是 Oracle 中的默认 fetchSize - 巧合?),接下来的 355 行是错误的。
我还发现了一些提示,OracleResultSet
如果 fetchsize 集大于实际结果大小,则可能根本不设置 fetchsize 可能不是最好的主意,因为 javadoc 告诉我抛出 SQLException。但是,我没有得到异常,只是默默地错误数据。