2016-11-14 22 views
3

Oracleパッケージには、そのパッケージのすべての手順で初期化され使用されるいくつかのグローバル変数があります。複数のセッションを持つOracleパッケージのグローバル変数

プロシージャを呼び出すと(jdbc接続と呼び出しを介して)、グローバル変数は正しく初期化され、その値は開かれたデータベースセッションのすべてのプロシージャで持続されますが、複数のjdbc接続がある場合、値はコール間で混合されます。

Oracleセッションはパッケージ変数の観点から分離されていませんか?隔離を保証するためにデータベースまたはユーザープロファイルで行う必要のある設定がいくつかありますか?

My DBインスタンスは2ノードのRACにあります。

+0

バグを確認してください:バグ9681133 ORA-6508および/またはRACの有効なパッケージ変数に関する誤った結果https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=73092831412679&parent=DOCUMENT&sourceId=1348303.1&id=9681133.8 &_afrWindowMode = 0&_adf.ctrl-state = 6rwbo0st0_105これは問題です。 Btw、既にこの問題を解決している場合は、解決策を教えてください。 – Ranjith

答えて

1

各データベースセッションには、独自の変数セットがあります。

あなたのJavaアプリケーションは接続プールを使用しているため、Javaアプリケーションは常にプールから接続を取得してプールに戻します。その場合、JavaセッションとOracleセッションとの間には関係がありません。特定のJavaセッションでは、最初のコールではOracleセッションA、2番目のコールではOracleセッションB、3番目のコールではC、4番目のコールではBが使用されます。他のセッションも同じことをしているので、セッションBの状態は2つの呼び出し間で変更されている可能性があります。

一部の接続プールの実装では、あるセッションから別のセッションにデータが漏れないようにセッションがプールに返されたときに明示的にパッケージ変数をクリアします。他の実装では、異なるJavaセッションが、以前の呼び出しからどのような状態になってもパッケージ変数を見ることができます。いずれの場合も、エンタープライズJavaアプリケーションの一部としてパッケージ内の状態を維持することは悪い考えです。

代わりにグローバルコンテキストが必要な場合もありますが、パッケージ変数でどのような問題を解決しようとしているのかわからないため、そのことを知ることは難しいです。

+0

ジャスティンありがとう。適切に動作させるためには、各jdbcセッションにはグローバル変数のスコープが必要です。セッション間でglboal変数が混在すると、正しく動作しません。データベースに接続するJavaアプリケーションはサードパーティアプリケーション(Tibco)であり、接続プーリングが有効になっている可能性が非常に高いです。私はこのチームと連絡をとり、彼らがこの問題を管理できるかどうかを確認しようとします。時には、この動作を避けるために私がOracleで行うことができる他の設定はありますか? – Lucas

+0

@Lucas - 理論的には、Javaアプリケーションを再構築して、接続プーリングを使用しないで、Javaセッションの存続期間中にOracleセッションをJavaセッションに割り当てることができます。そうすれば、データベースサーバー上で共有サーバー/ MTSを使用することがほぼ確実に必要なOracleセッションの数が大幅に増加します。しかし、サードパーティのアプリケーションを書いた人たちに、あなたのための非常に大きな書き換えを行うように説得することは非常にありそうもないようです。おそらく、あなたは状態のパッケージから離れる必要があるでしょう。 –

関連する問題