2011-10-18 14 views
0

Javaアプリケーションは、頻繁に重いデータベースクエリを実行します。 JavaプロセスとOracleプロセスが同じコンピュータ上で実行されるため、これらの重いクエリはCPUやIOを消費して、重要なアプリケーションスレッド、つまりユーザーの要求が応答しなくなることがあります。ユーザーに関連するスレッドの応答

私は、Oracleのトランザクション(または接続または接続プール)に優先順位を付けるソリューションを探しています。私はオラクルのResource Manager機能を認識していますが、使用するライセンスはありません。

優先順位付けが不可能な場合、トランザクションを途中で一時停止または中止することはできますか?我々は、Linux、J2EE上で実行されている

、SQL/

答えて

1

私の2セントの価値が休止状態:レベルではなく、オラクルのJavaに依存する(すなわちアプリケーション)で優先順位を制御してみてください。これは、スレッドがデータベース要求を消費するPriorityBlockingQueueを使用して実行できます。

+0

優先度キューは、「最高値」要素のレンダリングに使用されるデータ構造です。スレッド優先度/スケジューリングとは何も関係ありません。 – seand

+0

@seand:あなたはPriorityQueueを考えています。私はPriorityBlockingQueueについて述べています。これは、マルチスレッドアプリケーション向けに設計されており、java.util.concurrentパッケージの一部を形成しています。 – Adamski

+0

これは良い答えですが、解決策ではありません。アプリケーションが多量のクエリをOracleに問い合わせると、途中でユーザー要求があるかどうかわからない場合 –

1

私はあなたがUIのイベントディスパッチスレッドからこれらのDB操作を行う試みていないことを信頼しています:)

あなたは、スレッドの優先順位をいじってみてください。 UIが応答性を保つように、DBスレッドの優先度を下げてください。ただし、これは効果的ではない可能性があり、優先順位の逆転などの他の問題がある可能性があります。

もう一つのアイデアは、短いスレッドをDBスレッドに入れたり、yield()を頻繁に試してみることです。これらは、他の同時DBクライアントをブロックしないように、DBトランザクション外で実行する必要があります。

+0

アプリケーションCPUがスレッドを消費することはまさにこのように動作しますが、私はUI要求大量のOracleによる問合せ処理の途中で発生する –

+0

DBは、しばしば、独自のボックスに格納されることをお薦めします。 Oracleの正確な内容がCPUを噛み砕いているのをご存じですか?おそらくあなたはその面でできることがあります。 Oracleプロセスのスレッド優先順位を下げることができるかもしれませんが、それは不可能かもしれません。 – seand

0

Oracle側では、私は確かにではありません。は、Oracleサーバーのプロセスの優先順位をつぶすことをお勧めします。主な理由は、任意の時点で、OracleプロセスがSGAの一部の要素にロックまたはラッチを保持している可能性があることです。プロセスの優先順位を下げ、ロックやラッチを保持していると、他のOracleサーバー・プロセスのパフォーマンスに影響を与える可能性があります。ロック/ラッチ・ホルダの後ろにキューがあるため優先順位が低くなります。 CPUを取得できません。

Oracle自体は、特定のバックグラウンド・プロセスを高い優先度で実行することを許可していますが、これは設計上のもので、Oracleに組み込まれている機能です。私は個々のサーバープロセスの優先順位を混乱させません。

最後に、Javaアプリケーションコードを別のサーバーに移動する可能性について実際に検討します。そうすれば、OracleとJavaは希少なリソースのようなものと競合することはありません。

希望に役立ちます。

関連する問題