8

作为升级 JRun 的一部分,我们正在从 1.4 JVM 迁移到 1.6 JVM。现在我收到一个非常奇怪的 oracle db 错误:“OALL8 处于不一致状态”。我已经确定了插入根本不使用绑定变量的查询的问题 - 所有内联参数。如果我在没有任何绑定变量的情况下运行查询,则会收到上述错误。一旦我用绑定变量替换了其中一个硬编码值 - 一切都会正常工作。

另一个奇怪的地方是,在执行查询之后,它实际上是提交给数据库的。我可以从另一个会话连接并查看插入的行。我已经尝试将查询包装在事务中,并且它似乎成功了,因为没有显式事务的查询的行为没有改变。

以下是相关细节:

Java 版本:1.6.0_12-b04
虚拟机版本:11.2-b01(HotSpot 服务器)
Oracle 服务器:10.2.0.4
Oracle 客户端:11.1.0.7.0 到 ojdbc6.jar

更新:我正在使用 cfqueryparam - 它们在 oracle 世界中被称为绑定变量。虽然这确实解决了眼前的问题,但我们有一个相当大的遗留代码库,作为从 CF7 升级到 CF8 的一部分,我们实际上无法通过所有这些代码库来更新查询。

即使我已经确定了一种失败的特定情况(并将其封装在一个 mxunit 测试中)——这并不意味着没有其他领域可能成为问题。我真的很想有一个解决方案来消除 OALL8 错误,而不是围绕它进行编码。

更新 2:在与我们的 DBA 核实后,他将一个名为 CURSOR_SHARING 的参数设置为 SIMILAR。Oracle 默认值为 EXACT。正在发生的事情是当 ColdFusion 将查询交给执行时,Oracle 将所有文字值转换为绑定变量,这似乎使 ColdFusion 感到困惑。将设置转回 EXACT 可以让文字查询正常工作。

更新 3: Oracle 终于向我们发布了 JDBC 的带外补丁。它被识别为 JDBC 错误。最新的驱动程序在最终更新时应该包含它。如果您有支持,您还可以通过他们的 TAR 系统请求补丁。

4

3 回答 3

8

所以...使用绑定变量?

无论如何,您都应该使用它们(通过cfqueryparam)来确保安全,如果它解决了问题,那就更有理由这样做了。


如果您对实际错误的含义感兴趣,Google 有很多 结果,表明这是 JDBC 驱动程序错误,甚至建议有补丁 可用


但是我在您的帖子中没有看到实际问题...?

于 2009-03-24T23:47:07.750 回答
1

我发现这个http://asanga-pradeep.blogspot.com/2008/06/oall8-is-in-inconsistent-state-with.html

Oracle 补丁 4390875

于 2010-08-24T15:54:37.697 回答
0

如果您的应用程序在 weblogic 中运行,您应该将 ojdbc.jar 复制到安装目录 "weblogic81\server\lib" ,覆盖同名文件。

于 2013-08-06T07:43:28.677 回答