私はグーグルで回りました、そして私の印象はそれです
クライアントからのSQL * NETメッセージ
は、Oracle DBMSがクライアントがDBMSに新しいコマンドを送信するのを待機しているため、このイベントで費やされる時間はクライアント側の時間であり、DBサーバーのCPUを消費しないことを示唆しています。つまり、通常、このイベントのセッションは、「アクティブ」ではなく「非アクティブ」である必要があります。
私たちを困惑させているのは、今週から(接続プールの使用を開始した後[dbcpを使用])、セッションが
クライアントからのSQL * NETメッセージ
イベントと「ACTIVE」を同時に長時間表示する。この間、DBのCPU使用率は高くなります。
誰もがこれが何を意味するかについていくつかの光を当てることができますか?クライアントがメッセージを送信するのをDBセッションが待っている場合、それは「アクティブ」であり、CPUサイクルを消費している可能性がありますか?
犯人を見つけたようです。最近のアプリサーバーのアップグレードに続いて、誤ってojdbc14とojdbc6の両方のjarをデプロイメントに含めましたが、明らかに、jvmがOracle DBドライバー用にojdbc14を選択しました。 ojdbc14を手動で削除したため、この問題は過去24時間以内に再び発生することはありません。私はojdbc14がもはや公式にサポートされていないので、あらゆる種類の面白い問題を引き起こす可能性があると思います。
次のステップは、最初にojdbc14がどのようにしてデプロイメントに潜入したかを調べることです。
セッションがアクティブで、アイドルイベントの場合、それはおそらくCPU上にあり、待機していません。次のようなクエリを実行して、確実に確認できます
select
nvl(s.username,s.program) username,
s.sid sid,
s.serial# serial,
s.sql_hash_value sql_hash_value,
substr(decode(w.wait_time,
0, w.event,
'ON CPU'),1,15) event ,
w.p1 p1,
w.p2 p2,
w.p3 p3
from v$session s,
v$session_wait w
where w.sid=s.sid
and s.status='ACTIVE'
and s.type='USER';
ただし、この種のデータ収集は自動的に行われ、v $ active_session_historyに収集されるため、v $ active_session_historyにクエリを実行するだけで、セッションが実際に行っていることを確認できます