Oracle DB の「セッション」と「プロセス」って何?
Web アプリと Oracle DB を接続する時、JDBC コネクションプール数を設定したりするが、この「プール数」というのは、Oracle DB 側で設定する「セッション数」や「プロセス数」よりも小さくしておかないといけない。受け入れ側 (DB 側) のキャパを超える接続をしようとしてしまうからだ。
それはそうなんだろう、と思うが、じゃあこのセッションとプロセスというのは何なの?という話。
調べてみたところ、以下のページが一番分かりやすかった。
- Oracleに接続するとセッションが1つ生成される
- そのセッションを通じてSQL文を発行するとプロセスが生成される
- 通常は1セッション=1プロセスだけど、パラレル実行すると1セッション=nプロセスになる
なるほど、1 セッション・n プロセスという関係で考えておくのが良さそうだな。少なくとも、「セッション数よりもプロセス数の方が大きい」状態にはならないのだろう、と。
…と思ったが、セッション数とプロセス数を変更してみたら、面白い動きをした。
まず、現在のセッション数とプロセス数の上限は以下で確認できる。
SELECT * FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME IN ('processes', 'sessions');
手元の DB で見てみると、
- プロセス : 200
- セッション : 334
…となっていた。どうもセッション数の方が大きいのだ。「1 セッション = n プロセス」になりうるのに?
プロセス数とセッション数は以下の SQL で変更できる。反映は DB の再起動が必要になる。
ALTER SYSTEM SET PROCESSES = 400 SCOPE=SPFILE;
ALTER SYSTEM SET SESSIONS = 450 SCOPE=SPFILE;
すると、プロセス数の上限は指定したとおりだったが、セッション数の上限が勝手に引き上げられていた。
- プロセス : 400
- セッション : 622
…うーん、この動きの意味が分からないや。でもなんか自動調整とかされるんならプロセス数だけ気にしておけばいいのかなー。
ちなみに、現在のセッション一覧は以下で確認できる。
SELECT
machine,
TO_CHAR(LOGON_TIME, 'YYYY/MM/DD HH24:MI:SS') LOGON_TIME,
sid,
serial#,
USERNAME,
OSUSER
FROM
V$SESSION
WHERE
STATUS = 'INACTIVE'
ORDER BY
LOGON_TIME;
理屈がまだ分からないので、要勉強…。