2011-12-09 22 views
4

私はJava Webアプリケーション内でSQLを呼び出すと、Oracle 10gのバグに大きな間違いがあります。すぐにパッチを当てたり、11gにアップグレードすることはできません。これは最初の「愚かな」オラクルサポートの応答であるようです。回避策がありますが、Javaコード内でPreparedStatements内でこれを実行するのに問題があります。PreparedStatementとOracle 10gのバグ

実際のエラーがある:

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

バグがある:私達は私達のバグを誘発するSQLを実行する前に、Oracleのバグ12419392

は、周りの仕事が

alter session set "_hash_join_enabled" = FALSE; 

を実行しています。しかし、伝統のPreparedStatementは、SQLの1つの作品になります:ただのシリーズを実行することによって

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

それともこれが可能である:

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

が、それはこのようになります1つのPreparedStatementの呼び出しを持つことが可能ですシーケンシャルなPreparedStatementは相次いでいますか?

私は本当に誰かが助けてくれることを願っています。ありがとう。

を編集してください:@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 
+0

接続プールを使用していますか?準備された声明の後/前に解放され、再取得された接続ですか?あなたはそのような行の2つのSQL文を使ってテストしましたか?結果は何でしたか? – xQbert

+0

いいえ、これをテストしていないので、このインスタンスの変更セッションを実行すると、このSQLを呼び出さない他のユーザーに影響するかどうかについてのフィードバックが必要でした。はい、接続プーリングを使用していますが、私は最適なやり方で考えています。有用であれば、GlassFish Server Open Source Edition 3.1(ビルド43)を実行しています。私が言うように、それは非常に間欠的であり、Oracleの明確なバグです。 – iaindownie

+0

前に接続プールaおよびoracleに関する問題を思い出してください。 http://stackoverflow.com/questions/5761175/odp-net-connection-pooling-clientid-client-identifier-never-changes-from-first。それは関連する問題であれば驚くべきことです:基本的にセッションはプールに返されたときに以前の使用から「汚い」でしたが、「すべて」は解放されませんでした。明示的にコマンドを実行することにより、セッションをクリアすることができました。彼らにも断続的に見えました。 – xQbert

答えて

1

OKを。私の主な質問に対する答えはNOである、あなたはそうのようなPreparedStatementを作成することはできません。

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

は、SQLの1ビットのために一時的にセッションを変更する個々のステートメントを実行ひどいようだとも容認できないほど鈍化応答作業を行ったが、合意。オプションは、パッチやアップグレード、またはno_use_hashヒント(私は遅すぎると思う)を見ているようだ。コードを見ます。