データベース接続プールの設定は、システムとデータベースとの効率的かつ安定した接続を確保するための重要なステップです。適切な接続プールの設定により、データベース接続数を効果的に管理し、高並行性による接続枯渇問題を回避できるだけでなく、適切なタイムアウト設定により無効な接続をタイムリーにクリーンアップし、システム性能を確保することができます。
本記事では、接続プールパラメータの推奨設定およびJDBC設定における重要なパラメータについて紹介し、開発者がデータベースアクセスを最適化するのに役立てていただくことを目的としています。
接続プールパラメータ
接続プール設定の推奨事項
マネージコンソールの日常的な最小接続数は2つを維持すれば十分です。具体的な数は業務の並行性やトランザクション時間に応じて調整してください。
接続のアイドルタイムアウト時間を設定します。30分を推奨します。
MySQLのデフォルトでは、接続は8時間後に自動的に切断されますが、クライアント側ではこの切断を検知できないため、ダーティコネクションが発生する可能性があります。接続プールは、ハートビートやtestOnBorrowなどのメカニズムを通じて接続の生存状態を検証し、この時間を超えて接続が使用されない場合は直接切断します。
JDBC設定パラメータ
JDBCで必ず設定が必要な重要なパラメータがいくつかあります。これらはすべて、接続プールのConnectionPropertiesまたはJdbcUrlに設定できます。具体的なパラメータとその説明は以下の表のとおりです。
パラメータ |
説明 |
|---|---|
| socketTimeout | ネットワークソケットのタイムアウト時間をミリ秒単位で定義します。値が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ステートメントを分解して、一つずつデータベースに送信します。この場合、一括挿入は実際には単一挿入となり、パフォーマンスが低下します。実際に一括挿入を実行するには、このパラメータをTRUEに設定する必要があります。そうすることで、ドライバーはSQLを一括実行します。addBatchメソッドを使用して、同一テーブル上の複数のinsertステートメントを一つのinsertステートメント内の複数のvalues値の形にまとめることで、batch insertのパフォーマンスを向上させます。
すべてのinsertをprepareStatement方式でprepareし、その後にaddBatchを行う必要があります。そうでない場合、結合実行はできません。
allowMultiQueries:TRUEに設定することを推奨します。JDBCドライバーは、アプリケーションコードが複数のSQLをセミコロン(;)で結合し、一つのSQLとしてサーバー側に送信することを許可します。
useLocalSessionState:トランザクションがOceanBaseデータベースに対して頻繁にセッション変数のクエリSQLを送信するのを避けるため、TRUEに設定することを推奨します。セッション変数は主に以下のものです:autocommit、read_only、およびtransaction isolation。
socketTimeout:SQL実行時に、ソケットがSQLの返却を待機する時間です。connectTimeout:接続確立時に、接続を待機する時間です。useCursorFetch:TRUEに設定することを推奨します。データ量の多いクエリステートメントについて、データベースサーバーはCursorを確立し、FetchSizeのサイズに応じてClientにデータを配信します。このプロパティを
TRUEに設定すると、useServerPrepStms=TRUEも自動的に設定されます。useServerPrepStms:SQLをデータベースサーバーに送信する際にPSプロトコルを使用するかどうかを制御します。TRUEに設定すると、SQLはデータベース内で2段階に分けて実行されます:?を含むSQLテキストをデータベースサーバーに送信し、Prepareを実行します(SQL_audit: request_type=5)。実際のValueを使用して、データベース内でExecuteを実行します(
SQL_audit: request_type=6)。
cachePrepStmts:JDBCドライバーがPSキャッシュを有効にしてPreparedStatementをキャッシュし、prepareの繰り返し実行(client側およびserver側)を回避するかどうかを制御します。cachePrepStmts=TRUEは、useServerPrepStms=TRUEを使用し、同じSQLに対してバッチ実行を繰り返すシナリオに役立ちます。各バッチ実行にはprepareとexecuteが含まれるため、cachePrepStmts=TRUEは繰り返しのprepare操作を回避することができます。prepStmtCacheSQLLimit:PSキャッシュに格納できるSQLの最大長の制限です。これを超える長さのSQLはキャッシュに入れることができません。prepStmtCacheSize:PSキャッシュが保存できるSQLの数です。maxBatchTotalParamsNum:バッチ操作において、1つのSQLがサポートできる最大パラメータ数(つまり、バッチ内の?の数)です。パラメータ数がこの制限を超える場合、バッチSQLは分割されます。