Java (データベース接続周り)
アプリケーションからデータベースに接続する上で、Java では Tomcat 等のアプリケーションサーバ経由、かつ、jdbc ドライバーで接続することが多いと考える。tomcat のデータソース周りの設定や各 jdbc ドライバー自体に独自の設定があるため、その辺りの挙動を調査、及び、検証してまとめていく。
Tomcat
Tomcat9 だと以下がJDBC Connection Poolのマニュアルとなっている。
https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html
主要と個人的に考えるパラメータ達。
Common Attributes
-
type
- javax.sql.DataSource 固定値で一旦 OK
-
factory
- Tomcat JDBC Connection Pool 利用時は org.apache.tomcat.jdbc.pool.DataSource
- Common DBCP 利用時は org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
- Tomcat JDBC Connection Pool の方が機能や性能がエンハンスされているらしいのでこちらを利用したい。
- ${CATALINA_HOME}/lib 配下にある tomcat-dbcp.jar が本体。
-
driverClassName
- 利用する jdbc ドライバーのクラス名を指定する。
- MySQL では、com.mysql.jdbc.Driver。jar ファイルを展開すると、com/mysql/jdbc/Driver.class というクラスファイルがあり。
-
url
- jdbcプロパティ識別子。jdbc ドライバーの設定をクエリストリングのような形で指定する。
- 例: jdbc:mysql://localhost:3306/db01?socketTimeout=30000
-
username
- DB ユーザー名
-
password
- DB ユーザーのパスワード
-
initialSize
- Tomcat起動時にDBへのTCP接続をESTABLISHさせるコネクション数。
-
minIdle
- プール内のコネクション数をminIdle以上保持。
- ただDB側の再起動でコネクション数が0になったときにこの値まで底上げしてくれるわけではない。逆にアイドルコネクションがminEvictableIdleTimeMillisで破棄される時はこの値までは残してくれる。
-
maxIdle
- プール内のコネクション数をmaxIdle以下に制限。あまり意味がないかも...?
-
maxActive
- プールから同時点で貸し出すコネクションの最大数
-
maxWait
- プール内のコネクションが不足したときの最大待ち時間(ミリ秒)
-
testOnConnect
- コネクションが最初に確立される際にvalidationQueryで検証するかどうか
-
testOnBorrow
- コネクションを貸し出す際にvalidationQueryで検証するかどうか
-
testOnReturn
- コネクションを返却する際にvalidationQueryで検証するかどうか
-
validationQuery
- コネクションが有効かどうかを検証するためのSQL
-
validationQueryTimeout
- validationQuery が失敗するまでのタイムアウト時間(秒)
-
timeBetweenEvictionRunsMillis
- アイドル状態のコネクションの破棄実行間隔
-
minEvictableIdleTimeMillis
- どの程度プール内で連続してアイドル状態だったらtimeBetweenEvictionRunsMillisの破棄対象になるか。
-
defaultAutoCommit
- コネクションを確立するときに autocommit を有効化するかどうか。(コネクション確立時の set autocommit 文の値を1にするか0にするか?)
- setAutoCommitメソッドが JDBC ドライバー側で呼ばれない場合に発行。
-
removeAbandoned
- コネクションクローズ漏れでプールにコネクションを返していない接続をremoveAbandonedTimeout経過後にabondonedと判定して破棄(TCP接続終了)させるかどうか。
-
removeAbandonedTimeout
- コネクションクローズ漏れでプールにコネクションを返していない接続をabondonedと判定する秒数。
Tomcat JDBC Enhanced Attributes
-
initSQL
- コネクション確立時に一度だけ発行される特定のSQL
-
validationInterval
- プール内の同一のコネクションに関して前回の検証処理からこの時間(ms)経過していなければ検証は実施しない。
- デフォルト 30000 ms。
-
fairQueue
- true の場合、プール内のコネクションの貸し出しをFIFOで行う。
-
maxAge
- プールからのコネクション貸し出し時、コネクションの確立からこの時間(ms)経過していたら貸し出す前にそのコネクションを再TCP接続する。
- プールへのコネクション返却時、コネクションの確立からこの時間(ms)経過していたら返却後にそのコネクションを再TCP接続する。
- プール内コネクションがアイドル状態時、かつ、minEvictableIdleTimeMillis経過していた場合で、コネクションの確立からこの時間(ms)経過していたらそのコネクションを再TCP接続する。
- DB側の障害などでコネクションが貸し出されても腐っていた場合に有用な気がする。