PreparedStatement をバッチ実行と組み合わせることで、単一の JDBC 呼び出しで複数のレコードを LindormTSDB に書き込むことができます。これにより、ネットワーク往復回数(round trip)が削減され、書き込みスループットが向上します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
LindormTSDB への JDBC 接続が確立されていること。接続設定方法については、「Lindorm JDBC ドライバーを使用した Lindorm TSDB への接続および利用(推奨)」をご参照ください。
書き込み先となる時系列テーブルが存在すること。テーブル設計に関するガイドラインについては、「時系列テーブルの設計」をご参照ください。
仕組み
PreparedStatement を使用すると、INSERT 文を一度定義し、異なるパラメーター値で繰り返し実行できます。addBatch() を各行に対して呼び出し、その後 executeBatch() を実行することで、すべての行が単一のデータベース往復(round trip)で送信されます。これは、個別の INSERT 文をそれぞれ実行するよりも大幅に効率的です。
すべてのカラムパラメーターは、疑問符 (?) プレースホルダーを用いて位置指定でバインドされます。setXXX() 呼び出しに渡すインデックスは、INSERT 文内のカラム順序と正確に一致させる必要があります。
バッチによるデータ書き込み
以下の手順では、「時系列テーブルの設計」で紹介されている aqm 空気質テーブルを例として使用します。
connectionオブジェクトを作成します。接続設定については、「Lindorm JDBC ドライバーを使用した Lindorm TSDB への接続および利用(推奨)」をご参照ください。INSERT 文を指定して
PreparedStatementオブジェクトを作成します。StringBuilder builder = new StringBuilder(); builder.append("INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) "); builder.append("VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); PreparedStatement preparedStmt = connection.prepareStatement(builder.toString());各行のパラメーターをバインドし、バッチを実行します。
for (int i = 0; i < batchSize; i++) { // INSERT 文のカラム順序と同じ順序で値をバインドします。 // city、district、id、ts、pm25、pm10、so2、no2 はローカル変数です。 preparedStmt.setString(1, city); preparedStmt.setString(2, district); preparedStmt.setString(3, id); preparedStmt.setTimestamp(4, ts); preparedStmt.setDouble(5, pm25); preparedStmt.setDouble(6, pm10); preparedStmt.setDouble(7, so2); preparedStmt.setDouble(8, no2); // 行をバッチ実行用にキューに登録します。 preparedStmt.addBatch(); } // キューに登録されたすべての行をデータベースに書き込みます。 int[] results = preparedStmt.executeBatch(); // results[i] には、バッチ内の各行に対する更新件数が格納されます。
注意事項
パラメーターのバインド:LindormTSDB では、PreparedStatement がサポートするプレースホルダーは疑問符 (?) のみです。setXXX() 呼び出しに指定するインデックスは、INSERT 文内のカラム位置と厳密に一致させる必要があります。
バッチサイズ:バッチサイズは、スループットとレイテンシーのトレードオフを制御します。大きなバッチはネットワーク往復回数を削減しますが、メモリ使用量と各リクエストのレイテンシーを増加させます。ただし、バッチサイズを大きくしても必ずしも書き込み性能が向上するわけではなく、最適な値はテーブル構造に依存します。
| テーブル構造 | 推奨される batchSize |
|---|---|
| フィールドカラムが 1 つ、タグカラムが最大 5 つ | 5,000 |
| その他の構造 | ご使用の環境における実測されたスループットおよびレイテンシーに基づき調整してください |