JRun のアップグレードの一環として、1.4 JVM から 1.6 JVM に移行します。今、私は本当に奇妙なOracle dbエラーを受け取っています: "OALL8 is in an inconsistent state". バインド変数をまったく使用しないクエリ (すべてインライン パラメータ) を挿入するという問題を突き止めました。バインド変数なしでクエリを実行すると、上記のエラーが発生します。ハードコードされた値の 1 つをバインド変数に置き換えるとすぐに、すべてがエラーなしで機能します。
もう 1 つの奇妙な点は、クエリを実行した後、実際にはデータベースにコミットされていることです。別のセッションから接続して、挿入された行を確認できます。トランザクションでクエリをラップしようとしましたが、明示的なトランザクションなしでクエリから動作が変更されていないため、成功したようです。
関連する詳細は次のとおりです。
Java バージョン: 1.6.0_12-b04
仮想マシン バージョン: 11.2-b01 (HotSpot サーバー)
Oracle サーバー: 10.2.0.4
Oracle クライアント: 11.1.0.7.0 (ojdbc6.jar 経由 )
更新:私は cfqueryparam を使用しています - それらはオラクルの世界ではバインド変数と呼ばれています。これで差し迫った問題は解決しますが、CF7 から CF8 へのアップグレードの一環としてクエリを更新するためにすべてを実行することは現実的に不可能な、かなり大きなレガシ コード ベースがあります。
失敗する特定の状況を 1 つ突き止めました (そして、それを mxunit テストでカプセル化しました) が、これが問題になる可能性のある他の領域がないという意味ではありません。私は、OALL8 エラーを回避するためのコーディングではなく、OALL8 エラーを除去するソリューションを導入したいと考えています。
更新 2: DBA に確認したところ、CURSOR_SHARING というパラメーターを SIMILAR に設定していました。Oracle のデフォルトは EXACT です。何が起こっているかというと、ColdFusion が実行のためにクエリを渡すと、Oracle はすべてのリテラル値をバインド変数に変換し、ColdFusion を混乱させているように見えます。設定を EXACT に戻すと、リテラル クエリが正常に機能します。
更新 3: Oracle はついに JDBC のアウトオブバンド パッチを発行しました。JDBC エラーとして識別されました。最新のドライバーには、最終的に更新されたときにそれが含まれているはずです。サポートがある場合は、TAR システムからパッチをリクエストすることもできます。