本記事では、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方式で準備を行い、その後にaddBatchを行う必要があります。そうしなければ、結合実行はできません。
allowMultiQueries:TRUEに設定することを推奨します。JDBCドライバーは、アプリケーションコードが複数のSQLをセミコロン(;)で連結し、一つのSQLとしてサーバー側に送信することを許可します。
useLocalSessionState:TRUEに設定することを推奨します。これにより、トランザクションが頻繁にOBデータベースにsession変数のクエリSQLを送信することを回避できます。session変数は主に、autocommit、read_only、transaction isolationです。
socketTimeout:SQL実行時に、socketがSQLの返却を待機する時間です。connectTimeout:接続確立時に、接続を待機する時間です。useCursorFetch:TRUEに設定することを推奨します。ビッグデータ量のクエリステートメントに対して、データベースサーバーはCursorを作成し、FetchSizeの大きさに応じてClientにデータを配布します。このプロパティを
TRUEに設定すると、useServerPrepStms=TRUEも自動的に設定されます。useServerPrepStms:PSプロトコルを使用してSQLをデータベースサーバーに送信するかどうかを制御します。TRUEに設定すると、SQLはデータベース内で2段階に分けて実行されます:?を含むSQLテキストをデータベースサーバーに送信してPrepareを行います(SQL_audit: request_type=5);実際のValueを使用して、データベース内でExecuteを行います(
SQL_audit: request_type=6)。
cachePrepStmts:JDBCドライバーがPS cacheを有効にしてPreparedStatmentをキャッシュし、prepare(クライアント側とサーバー側)の繰り返し実行を避けるかどうかを制御します。cachePrepStmts=TRUEは、useServerPrepStms=TRUEを使用し、同一SQLに対して繰り返しbatch executeを行うシナリオに役立ちます。各batch excecuteにはpreareとexecutecachePrepStmts=TRUEが含まれるため、繰り返しのprepare操作を回避できます。prepStmtCacheSQLLimit:PS cacheに格納できるSQLの長さ制限です。長すぎるSQLはキャッシュに格納できません。prepStmtCacheSize:PS cacheに保存できるSQLの数です。maxBatchTotalParamsNum:batch操作に対して、一つのSQLが最大でサポートできるパラメータ数(つまりbatch内の?の数)です。パラメータ数が制限を超える場合、batch SQLは分割されます。