DBのコネクションプールが不安定な時の対処法

OpenCms 設定マニュアル
データベースのコネクションプールが不安定な時の対処法
株式会社 ジークス
(2010 年 8 月 26 日更新)
1 問題とその
問題とその現象
とその現象
データベースのコネクションが不安定で、以下のような例外がログに記録される事があります。
“java.net.SocketException: Broken pipe”
“org.opencms.db.CmsDbSqlException: 次のクエリーを実行する際に SQL エラーが発生しました。”
”java.net.ConnectException: Connection timed out”
“java.sql.SQLException: Io exception: No route to host”
これにより、パブリッシュやスタティック・エクスポートが失敗したり、ログイン画面が真っ白にな
るなどの問題が発生します。
MySQL などでは、8 時間以上アクセスがない場合にコネクションが切断される仕様となっており、
暫く使わないでいると、最初のアクセス時にエラーが出力される場合もあります。
また、頻繁に起こるものでも、再現性のあるものでもなく、稀に発生するケースも確認されています。
2 対処方法
問題なく動作すればいいのですが、このようなケースに遭遇した場合は、データベースのパラメータ
を調整する事で回避する事ができます。
データベースの設定は、./WEB-INF/config/opencms.properties で行われています。
opencms.properties の以下の箇所を修正して下さい。
testOnBorrow が false であれば、true に変更する。
db.pool.default.testOnBorrow=true
testQuery にテスト用の SQL を記述する。
db.pool.default.testQuery=SELECT
STRUCTURE_ID
FROM
CMS_OFFLINE_STRUCTURE
WHERE RESOURCE_PATH = '/'
これにより、testQuery で記述した SQL を使用して、データベースのコネクションが正常かどうか
をチェックするようになり、データベースのコネクションが安定します。
上記のサンプルの SQL はデータベースに依存しない SQL ですが、testQuery の SQL は頻繁に実行
されるので、比較的軽い SQL を記述して下さい。
例えば、Oracle であれば”select 1 from dual”、MySQL であれば” select 1” 等が利用できます。
同時に、以下のパラメータもチューニングすると良いかもしれません。
db.pool.default.testWhileIdle=true
db.pool.default.timeBetweenEvictionRuns=3600000
db.pool.default.numTestsPerEvictionRun=3
これらは、全て Commons DBCP のパラメータですので、詳しい説明はそちらの文献を参照して下さい。
※ ただ、これらのパラメータを調整する前に、コネクションの最大接続数や、接続待ち時間の設定
が、そもそも最適なのかどうかを確認して下さい。