argius note

プログラミング関連

Play2.0 コネクションプールの設定

Play2.0のコネクションプール設定については、下記リンクに説明があります。

それぞれの設定の意味が良く分からなかったので、コメント部分を訳しつつ、機能の動作を確認してみました。


今回は、Play2.0.4(BoneCPは0.7.1)を使用しています。


Play2.0のコネクションプール設定は即ち、BoneCP(BoneCPDataSource)の設定です。
例として、デフォルトデータソースの場合は、ログに

<com.jolbox.bonecp.BoneCPDataSource> JDBC URL = jdbc:h2:mem:play, Username = sa, partitions = 1, max (per partition) = 30, min (per partition) = 5, helper threads = 3, idle max age = 10 min, idle test period = 1 min

のように出力されます。(このログはデフォルトでは出力されません。)


application.confの初期状態では、必須項目と思われるdriver,url,user,passwordの4つのみ設定されていて、他は任意項目のようです。


任意項目は14あります。

  • autocommit
  • isolation
  • partitionCount
  • maxConnectionsPerPartition
  • minConnectionsPerPartition
  • acquireIncrement
  • acquireRetryAttempts
  • acquireRetryDelay
  • connectionTimeout
  • idleMaxAge
  • idleConnectionTestPeriod
  • initSQL
  • logStatements
  • maxConnectionAge


そして、ドキュメントに書かれていない項目がいくつかあります。

  • defaultCatalog
  • readOnly
  • disableJMX
  • connectionTestStatement
  • jndiName


以下、それぞれの項目についての詳細です。
なお、日本語訳が拙いのはお察しくださいご了承ください。
具体的な設定の使われ方は、DB.scala内のprivateクラスBoneCPApiのprivate関数#createDataSource(DB.scala:L.287)を辺りを見ると分かります。
BoneCPのAPI仕様はこちら(Class BoneCPConfig)にあります。


  • autocommit

コネクションのデフォルトautocommit設定を設定する

java.sql.Connection#setAutoCommitで設定されます。


  • isolation

コネクションのデフォルト同期レベルを設定する

トランザクション同期レベルの設定。
java.sql.Connection#setTransactionIsolationで設定されます。
java.sql.Connectionの定数フィールド、Transaction_XXXとこの設定がマッピングされています(DB.scala:L.302)。


  • partitionCount

ロック競合を減らすことでパフォーマンス向上させるために、
それぞれの流入するコネクション要求が
スレッド親和性のあるプールからコネクションを抜き出す。
この数値を高くすればするほど、大量の短命スレッドを
使用する場合のパフォーマンスは良くなるだろう。
一定の閾値を超えて、これらのプールを維持することは
パフォーマンスにおいて負の効果をもたらすだろう
(パーティションのコネクションが尽きかけた場合のみ)。

スレッドごとに異なるパーティションを割り当てればロック競合を減らすことができる、ということでしょうか。
(com.jolbox.bonecp.)BoneCPDataSource#setPartitionCountで設定されます。


  • maxConnectionsPerPartition

パーティション毎に作られるコネクション数。
3パーティションのとき、この設定を5に設定すると、
データベースに15の独立したコネクションを持つことを意味する。


次のことに注意すること。
BoneCPは一度にすべてのコネクションを接続しようとするのではなく、
minConnectionsPerPartitionに従って開始して
必要に応じて徐々に増やす。

  • minConnectionsPerPartition

パーティションごとの、初期コネクション数。

コネクションプールは、最初のアクセスがあった時に構築されます。このときは、minConnectionsPerPartitionの数だけコネクションが確保されます。
それぞれ、BoneCPDataSource#setMaxConnectionsPerPartition/setMinConnectionsPerPartitionで設定されます。


  • acquireIncrement

利用可能なコネクションが枯渇しそうになったとき、
BoneCPは一括で動的に新しいコネクションを作る。
このプロパティは一度にいくつの新しいコネクションに接続するかを
制御する(maxConnectionsPerPartitionの最大値に従って)。
注意:これはパーティションごとの設定である。

例えば、partitionCount=2、minConnectionsPerPartition=1、maxConnectionsPerPartition=5、そしてこの値を3にしたとき、コネクションプール構築時にパーティション#1,#2がそれぞれコネクション=1になります。パーティション#1でコネクションが2つ必要になったら、一度に3つの新しいコネクションを追加して、パーティション#1はコネクション=4となります。パーティション#2はコネクション=1のままです。
BoneCPDataSource#setAcquireIncrementで設定されます。


  • acquireRetryAttempts

コネクションの獲得を試みて失敗した後で、
断念するまで、この回数分接続を試みる。

  • acquireRetryDelay

失敗の後で再びコネクションの確保を試みる前に
どのくらい待つかの時間。

リトライに関する設定。
例えば、acquireRetryAttempts=3, acquireRetryDelay=5 seconds に設定した場合、
最初の接続失敗のあとで、接続に成功するまで"5秒待機→再接続"を3回繰り返し、それでもダメなら接続失敗となります。
それぞれ、BoneCPDataSource#setAcquireRetryAttempts/setAcquireRetryDelayInMsで設定されます。


  • connectionTimeout

getConnectionの呼び出しがタイムアウトになる前に
待機する最大時間。

未確認。
BoneCPDataSource#setConnectionTimeoutInMsで設定されます。


  • idleMaxAge

アイドリング最大寿命

未確認。
BoneCPDataSource#setIdleMaxAgeで設定されます。


  • idleConnectionTestPeriod

これは、DBにテストクエリーを送信する前に
コネクションがアイドリングに留まる時間を設定する。

これは、終了時にコネクションがタイムアウトになるのを
防ぐのに役立つ。

未確認。
BoneCPDataSource#setIdleConnectionTestPeriodで設定されます。


  • initSQL

コネクションが最初に接続されるときにのみ実行される
初期SQL文。

説明の通り。
BoneCPDataSource#setInitSQLで設定されます。


  • logStatements

有効にすると、実行されるSQL文がログに記録される。

これに加えて、application.confに
logger.com.jolbox.bonecp.PreparedStatementHandle=DEBUG
を追加すると、標準のログに出力されます。
BoneCPDataSource#setLogStatementsEnabledで設定されます。


  • maxConnectionAge

最大コネクション寿命。

最後に使用されてから、この時間が経過すると、コネクションは即時に破棄されます。
BoneCPDataSource#setMaxConnectionAgeで設定されます。


  • defaultCatalog
  • readOnly

これらは、autocommit、isolationと同様にjava.sql.Connectionに直接反映される項目のようです。
それぞれ、java.sql.Connection#setCatalog/setReadOnlyで設定されます。


  • disableJMX

JMXを無効にする、くらいしかわかりませんでした。
BoneCPDataSource#setDisableJMXで設定されます。


  • connectionTestStatement

initSQLに対して、こちらはkeep-aliveなどのコネクションを維持するために使用されるSQL文です。これを設定しない場合は、メタデータによるリクエストでテストを行う(その場合は互換性はあるが遅くなる可能性がある)とされています。
詳しくは、APIドキュメント参照。(BoneCPConfig#setConnectionTestStatement)


  • jndiName

JPAに関連するもののようです。
http://scala.playframework.org/documentation/2.0.4/JavaJPAを参照してください。



以上です。