Utilisez PreparedStatement avec une exécution par lots pour écrire plusieurs enregistrements dans LindormTSDB lors d'un seul appel JDBC. Cette approche réduit les allers-retours réseau et améliore le débit d'écriture.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une connexion JDBC établie vers LindormTSDB. Pour obtenir les instructions de configuration, consultez la rubrique Utilisation du pilote Lindorm JDBC pour se connecter à Lindorm TSDB et l'utiliser (recommandé).
Une table de séries temporelles cible pour l'écriture des données. Pour des conseils sur la conception des tables, reportez-vous à la section Conception d'une table de séries temporelles.
Fonctionnement
PreparedStatement vous permet de définir une instruction INSERT une seule fois et de l'exécuter plusieurs fois avec différentes valeurs de paramètres. En appelant addBatch() pour chaque ligne, puis executeBatch(), vous envoyez toutes les lignes en un seul aller-retour vers la base de données. Cette méthode est nettement plus efficace que l'exécution d'instructions INSERT individuelles.
Tous les paramètres de colonne sont liés par position à l'aide du caractère de remplacement point d'interrogation (?). L'index transmis à chaque appel setXXX() doit correspondre à l'ordre des colonnes défini dans l'instruction INSERT.
Écriture des données par lots
Les étapes suivantes utilisent la table de qualité de l'air aqm présentée dans la rubrique Conception d'une table de séries temporelles à titre d'exemple.
Créez un objet
connection. Reportez-vous à la rubrique Utilisation du pilote Lindorm JDBC pour se connecter à Lindorm TSDB et l'utiliser (recommandé) pour configurer la connexion.-
Créez un objet
PreparedStatementcontenant l'instruction INSERT.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()); -
Liez les paramètres pour chaque ligne et exécutez le lot.
for (int i = 0; i < batchSize; i++) { // Bind values in the same order as the columns in the INSERT statement. // city, district, id, ts, pm25, pm10, so2, no2 are local variables. 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); // Queue the row for batch execution. preparedStmt.addBatch(); } // Write all queued rows to the database. int[] results = preparedStmt.executeBatch(); // results[i] contains the update count for each row in the batch.
Remarques d'utilisation
Liaison des paramètres : Dans LindormTSDB, PreparedStatement prend uniquement en charge le caractère de remplacement point d'interrogation (?). L'index utilisé dans chaque appel setXXX() doit correspondre exactement à la position de la colonne dans l'instruction INSERT.
Taille du lot : La taille du lot détermine l'équilibre entre le débit et la latence. Des lots plus grands réduisent le nombre d'allers-retours, mais augmentent l'utilisation de la mémoire et la latence par requête. Une taille de lot plus élevée n'améliore pas systématiquement les performances d'écriture ; la valeur optimale dépend de la structure de votre table.
| Structure de la table | **Valeur recommandée pour batchSize** |
|---|---|
| Une colonne de champ, jusqu'à cinq colonnes de tag | 5 000 |
| Autres structures | Ajustez la valeur en fonction du débit et de la latence observés dans votre environnement |