データベース接続プールの設定は、システムとデータベース間の効率的かつ安定した接続を確保するための重要なステップです。適切な接続プール設定により、データベースの接続数を効果的に管理し、高並行処理による接続枯渇問題を回避できるだけでなく、適切なタイムアウト設定を通じて無効な接続を適時にクリーンアップし、システムのパフォーマンスを確保することができます。
本記事では、開発者がデータベースアクセスを最適化できるよう、接続プールパラメータの推奨設定および JDBC 設定の重要なパラメータについて紹介します。
接続プールパラメータ
接続プール設定の推奨事項
管理コンソールの日常的な min(最小接続数)は2つ維持すれば十分です。具体的には業務の同時実行数やトランザクション時間に応じて調整してください。
接続のアイドルタイムアウト時間を設定することをお勧めします。推奨値は 30 分です。
MySQL はデフォルトで 8 時間経過すると接続を能動的に切断しますが、クライアントはこれを検知できないため、無効な接続(ダーティコネクション)が存在する原因となります。接続プールはハートビートや testOnBorrow などのメカニズムを通じて接続が生存しているかを検証し、この時間を超えて使用されていない接続は直接切断します。
JDBC 設定パラメータ
JDBC の重要なパラメータは必ず設定する必要があります。これらはすべて接続プールの ConnectionProperties または JdbcUrl に設定できます。具体的なパラメータとその説明は以下の表の通りです。
パラメータ |
説明 |
|---|---|
| socketTimeout | ネットワーク Socket のタイムアウトをミリ秒単位で定義します。値が 0 の場合、タイムアウト制限なしを意味します。システム変数 max_statement_time を設定してクエリ時間を制限することも可能です。デフォルト値:0(標準設定)。 |
| connectTimeout | 接続タイムアウト値をミリ秒単位で定義します。値が 0 の場合、タイムアウト制限なしを意味します。デフォルト値:30000。 |
JDBC 設定例
本記事では、JDBC の設定例を紹介します。
JDBC を使用してデータベースに接続する際、データベースの最高パフォーマンスを引き出すために、関連パラメータを設定する必要があります。ここでは、いくつかの関連パラメータの推奨設定を紹介します。
JDBC 接続の例は以下の通りです:
conn=jdbc:oceanbase://xxx.xxx.xxx.xxx:3306/test?rewriteBatchedStatements=TRUE&allowMultiQueries=TRUE&useLocalSessionState=TRUE&useUnicode=TRUE&characterEncoding=utf-8&socketTimeout=10000&connectTimeout=30000
この接続に関わる設定パラメータは以下の通りです:
rewriteBatchedStatements:TRUEに設定することをお勧めします。- OceanBase の JDBC ドライバは、デフォルトで executeBatch() 文を無視し、バッチ実行される SQL 文のグループを分割してデータベースに 1 件ずつ送信します。この場合、バッチ挿入は実質的に単一挿入となり、直接的にパフォーマンスの低下を招きます。実際にバッチ挿入を実行するには、このパラメータを
TRUEに設定する必要があります。これにより、ドライバは SQL をバッチ実行するようになります。つまり、addBatch メソッドを使用して同一テーブルに対する複数の insert 文を 1 つの insert 文内の複数の values 値の形式にまとめ、batch insert のパフォーマンスを向上させます。
- OceanBase の JDBC ドライバは、デフォルトで executeBatch() 文を無視し、バッチ実行される SQL 文のグループを分割してデータベースに 1 件ずつ送信します。この場合、バッチ挿入は実質的に単一挿入となり、直接的にパフォーマンスの低下を招きます。実際にバッチ挿入を実行するには、このパラメータを
毎回の insert に対して prepareStatement 方式を使用して prepare を行い、その後に addBatch を行う必要があります。そうしないと、結合して実行することはできません。
allowMultiQueries:TRUEに設定することをお勧めします。JDBC ドライバは、アプリケーションコードが複数の SQL をセミコロン(;)で連結し、1 つの SQL としてサーバー側に送信することを許可します。
useLocalSessionState:TRUEに設定することをお勧めします。これにより、トランザクションが頻繁に OB データベースへセッション変数の照会 SQL を送信することを防ぎます。セッション変数は主に autocommit、read_only、および transaction isolation です。
socketTimeout:SQL を実行する際、Socket が SQL の応答を待機する時間です。connectTimeout:接続を確立する際、接続を待機する時間です。useCursorFetch:TRUEに設定することをお勧めします。
データ量の多いクエリ文に対して、データベース Server は Cursor を作成し、FetchSize のサイズに応じて Client にデータを配信します。このプロパティを TRUE に設定すると、自動的に useServerPrepStms=TRUE も連動して設定されます。
useServerPrepStms:PS プロトコルを使用して SQL をデータベース server に送信するかどうかを制御します。
TRUE に設定した場合、SQL はデータベース内で以下の 2 つのステップに分けて実行されます:
?を含む SQL テキストをデータベース Server に送信して Prepare を行います(SQL_audit: request_type=5)。実際の Value を使用してデータベース内で Execute を行います(
SQL_audit: request_type=6)。cachePrepStmts:JDBC driver が PS キャッシュを有効にして PreparedStatment をキャッシュし、(client 側および server 側での)重複する prepare 実行を回避するかどうかを制御します。cachePrepStmts=TRUEは、useServerPrepStms=TRUEを使用し、同一の SQL に対して batch execute を繰り返すシナリオで役立ちます。各 batch execute には prepare と execute が含まれますが、cachePrepStmts=TRUEにすることで重複する prepare 操作を回避できます。prepStmtCacheSQLLimit:PS キャッシュに保存できる SQL の長さの制限です。制限を超える長さの SQL はキャッシュに保存できません。prepStmtCacheSize:PS キャッシュが保存できる SQL の数です。maxBatchTotalParamsNum:バッチ操作において、1 つの SQL がサポートできる最大パラメータ数(つまり、batch 内の?の数)です。パラメータの数が制限を超えた場合、batch SQL は分割されます。