2

我有以下相当奇怪的行为:

提取器从数据库执行相当多的查询,并使用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。但是,我没有得到异常,只是默默地错误数据。

4

1 回答 1

2

基本上,我的问题由两部分组成,一个类路径库冲突和一个驱动程序错误。

我刚刚意识到,在 Oracle11 驱动程序旁边,一个 springsource-oracle10 驱动程序潜入了 maven 依赖项。在本地执行应用程序时,这没有问题,因为只有 webapp-project 依赖于 oracle10-spring 驱动程序,但出于某种原因,Oracle10 总是选择在服务器上而不是 Oracle 11。

接下来,Oracle 10 驱动程序中存在一个错误,至少在连接到 Oracle 11 DB 时是这样:如果您将 fetch size 设置得太高,而不是 OracleResultSet 的 javadoc 中声明的 SQLException,那么会发生更多偷偷摸摸的事情。

我举个例子来说明。假设您多次执行同一个查询,第一次执行将为您提供 30 行,第二次执行将为您提供 60 行,第三次执行将提供 30 行。您将 fetch-size 设置为 50。

现在,第一次执行将为您提供正确的(预期的)结果,第二次也是如此。但是第三次​​查询执行只会给你 10 行正确的行(Oracle 标准提取大小),其余 20 行将来自第二次执行但是 - 这里变得复杂 - 语句的所有参数列将设置为语句中设置的参数值。

于 2013-04-03T18:44:51.673 回答