作为升级 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 系统请求补丁。