常駐接続プーリング(DRCP)で共有プールが肥大化する
前回導入したDRCPを使用しているOracleのshared_poolが異常な勢いで増えてしまったため、
ORA-04031: 共有メモリーの○○バイトを割当てできません
が発生してしまった。
SQL文でバインド変数を使用してないところも多いので共有SQL領域が増えているのかなと思い、
v$sgastat
を確認したところ。。。
select pool, name, bytes/1024/1024 MB from v$sgastat where pool = 'shared pool' order by 3; shared pool SQLA 1,289.1 shared pool kpplmcchtge:kpplmcc 10,677.5
共有SQL領域は1Gほどであったが、kpplmcchtge:kpplmcc
が10Gも使用されていた。
kpplmcchtge:kpplmccとはいったい。。。
そこで、
データベース常駐接続プールのプールと接続のクラス・マッピングに関する情報(V$CPOOL_CC_INFO
)を確認したところ。
>select * from V$CPOOL_CC_INFO ; POOL_NAME -------------------------------------------------------------------------------- CCLASS_NAME -------------------------------------------------------------------------------- SYS_DEFAULT_CONNECTION_POOL ORA.OCI:SP:HqzTc6WwNWngU0fGqMAhCA ・ ・ 実行計画 ---------------------------------------------------------- ----------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ----------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1041 | 0 (0)| | 1 | FIXED TABLE FULL| X$KPPLCC_INFO | 1 | 1041 | 0 (0)| -----------------------------------------------------------------------
V$CPOOL_CC_INFO
の元表はX$KPPLCC_INFO
なのでkpplmcchtge:kpplmcc
と関連はあるだろうなと考えた。
しかも、V$CPOOL_CC_INFO
には大量の件数が登録されており、
DRCPのPOOLEDで接続するたびにランダムな値がCCLASS_NAME
に登録されることが原因で共有プールが肥大化しているようだ。
この共有プールの肥大化を抑えるには、
環境変数(ORA_CONNECTION_CLASS)になにかしらの値を設定することで
V$CPOOL_CC_INFO
のCCLASS_NAME
でその設定した値が再利用されるようになる。
export ORA_CONNECTION_CLASS=oradrcp_test >select * from V$CPOOL_CC_INFO ; POOL_NAME -------------------------------------------------------------------------------- CCLASS_NAME -------------------------------------------------------------------------------- SYS_DEFAULT_CONNECTION_POOL ORA.OCI:oradrcp_test
これで、共有プールの肥大化を抑えることができた。