【问题标题】:PreparedStatement and Oracle 10g bugPreparedStatement 和 Oracle 10g 错误
【发布时间】:2011-12-09 11:19:22
【问题描述】:

当我们在 Java Web 应用程序中调用一些 SQL 时,我在 Oracle 10g 中遇到了一个很大但间歇性的问题。我们无法快速修补或升级到 11g - 这似乎是第一个“愚蠢”的 Oracle 支持响应。有一种解决方法,但我在 Java 代码中的 PreparedStatements 中执行此操作时遇到问题。

实际错误是:

ORA-00600: internal error code, arguments: [kcblasm_1]

错误是:Oracle Bug 12419392

工作正在运行

alter session set "_hash_join_enabled" = FALSE;

在我们运行导致错误的 SQL 之前。然而,传统上 PreparedStatement 只接受一条 SQL:

PreparedStatement stmt = con.prepareSelect("sql statement2");

是否可以有一个如下所示的 PreparedStatement 调用:

PreparedStatement stmt = con.prepareSelect("sql statement1; sql statement2;");

或者这是否可以通过一个接一个地运行一系列连续的 PreparedStatements 来实现?

在圣诞节临近和支持减少等情况下不是最好的时间,所以我真的希望有人能提供帮助。谢谢。

编辑:@jonearles 要求提供代码,如果有任何用途,就在这里。可能非常具体到我们的项目,但有人可能会发现明显的错误诱导问题:

SELECT DISTINCT qm.validator_id,
  qm.QM_ID,
  u.EMAIL,
  qm.creation_dt,
  qm.emailed,
  qm.valid,
  qm.resolved,
  qm.new_obs_id,
  o.*,
  nests.*,
  s.*,
  l.*,
  latc.TENKM
FROM query_man qm,
  obs o,
  obs_aux_aon nests,
  sub s,
  location l,
  l_atlas_tetrad_coverage latc,
  users u
WHERE qm.OBS_ID         = o.OBS_ID
AND o.SUB_ID            = s.SUB_ID
AND u.user_id           = qm.user_id
AND o.obs_id            = nests.obs_id(+)
AND s.LOC_ID            = l.LOC_ID
AND latc.ATLAS_REGION   = 'NKNE'
AND (LENGTH (l.gridref) = 6
AND (SUBSTR(l.gridref,1,3)
  || SUBSTR(l.gridref,5,1)) = latc.TENKM
OR LENGTH (l.gridref)       = 4
AND l.gridref               = latc.TENKM)
AND qm.RESOLVED            IS NULL
ORDER BY latc.tenkm,
  l.tetrad

【问题讨论】:

  • 你在使用连接池吗?并且在每个准备好的语句之后/之前释放并重新获取连接?你有没有像这样连续使用 2 条 sql 语句进行测试?结果如何?
  • 不,还没有测试过,首先想要一些反馈,了解为此实例执行更改会话是否会影响其他不调用此 SQL 的用户。是的,我们正在使用连接池,我认为这是一种最佳方式(我自己对此有点模糊)。如果有用的话,我们正在运行 GlassFish Server Open Source Edition 3.1(内部版本 43)。正如我所说,这是非常断断续续的,并且是 Oracle 中的一个明确错误。
  • 记得之前连接池 a 和 oracle 的问题; stackoverflow.com/questions/5761175/…。想知道这是否是一个相关问题:基本上一个会话在返回到池时因为之前的使用而“脏”了,但没有释放“所有内容”;因此,通过显式运行命令,他们能够清除会话。对他们来说,这似乎也是间歇性的。
  • 谢谢 - 我们会调查这一点,尽管 Oracle 支持人员告诉我们这是一个错误,这表明连接池对我们来说不是问题。几年来一直工作正常。
  • 我更多地表明我不确定当连接被释放回池时使用更改会话会产生什么影响(因为连接永远不会“完全”释放“)因此您可能只需要在第一次建立连接时设置一次更改会话;随后的调用将不需要它。唯一的知道方法是测试,并且由于无法重新创建问题;充其量只能使测试变得困难。

标签: java web-applications oracle10g ora-00600


【解决方案1】:

好的。我的主要问题的答案是否定的,您不能像这样创建 PreparedStatement:

PreparedStatement stmt = con.prepareSelect("sql statement1; sql statement2;");

运行单个语句以临时更改会话以获取一点 SQL 确实有效,但同意似乎很糟糕,而且响应速度也慢得令人无法接受。选项似乎是补丁或升级,或者查看 no_use_hash 提示(我认为这也会很慢)。会看代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多