Utilisez le pool de connexions Alibaba Druid pour vous connecter à LindormTable via l'endpoint compatible MySQL.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Activé la fonctionnalité de compatibilité MySQL pour votre instance Lindorm. Consultez la rubrique Activer la fonctionnalité de compatibilité MySQL
Installé JDK V1.8 ou une version ultérieure
Ajouté l'adresse IP de votre client à la liste d'autorisation de votre instance Lindorm. Consultez la rubrique Configurer les listes d'autorisation
Ajouter les dépendances
Ajoutez les dépendances suivantes au fichier pom.xml de votre projet Maven :
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
**Si vous utilisez druid-spring-boot-starter**, excluez le composant druid intégré et déclarez explicitement la dépendance druid :
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
Configurer le pool de connexions
Dans le répertoire src/main/resources de votre projet Maven, créez le fichier druid.properties avec le contenu suivant :
# Driver class — keep this unchanged.
driverClassName=com.mysql.cj.jdbc.Driver
# Replace <endpoint> with your LindormTable endpoint for MySQL and <database> with your database name.
# To get the endpoint, see View endpoints: https://www.alibabacloud.com/help/en/lindorm/user-guide/view-endpoints
# Keep the other URL parameters unchanged to maintain optimal performance.
url=jdbc:mysql://<endpoint>:33060/<database>?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000
username=<username>
password=<password>
# Initialize the connection pool on startup — keep this unchanged.
init=true
# Number of connections to create during initialization.
initialSize=10
# Maximum number of connections in the pool. Set this to match your thread pool size.
maxActive=40
# Minimum number of idle connections. For high-throughput scenarios, set this equal to maxActive.
# For workloads with large fluctuations, use a smaller value.
minIdle=40
# Maximum time (ms) the client waits to get a connection — keep this unchanged.
maxWait=30000
# Limits how many times a single connection can be reused, preventing uneven load
# across Lindorm SQL frontend nodes. Has a minor performance impact.
phyMaxUseCount=30000
# Keep-alive settings — keep these unchanged to prevent unexpected disconnections.
druid.keepAlive=true
# If a connection has been idle for longer than this value (ms), its validity is checked.
druid.keepAliveBetweenTimeMillis=120000
# Interval (ms) at which idle connections are checked for eviction or keep-alive.
timeBetweenEvictionRunsMillis=60000
# Connections idle for longer than this value (ms) are candidates for eviction.
minEvictableIdleTimeMillis=1800000
maxEvictableIdleTimeMillis=1800000
# Connection validation settings — keep these unchanged.
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
Paramètres de connexion
| Paramètre | Description |
|---|---|
url |
URL de connexion JDBC. Format : jdbc:mysql://<Endpoint LindormTable pour MySQL>/<nom de la base de données>?<paramètres de connexion>. Si vous omettez le nom de la base de données, le client se connecte à la base de données par défaut. Pour plus de détails sur tous les paramètres de connexion, consultez la rubrique Paramètres de connexion. |
username |
Nom d'utilisateur LindormTable. Si vous avez oublié le mot de passe, réinitialisez-le dans le système de gestion du cluster LindormTable. Consultez la rubrique Modifier le mot de passe d'un utilisateur. |
password |
Si votre application s'exécute sur une instance Elastic Compute Service (ECS), utilisez une connexion VPC (Virtual Private Cloud) pour réduire la latence et renforcer la sécurité. Spécifiez l'endpoint VPC LindormTable pour MySQL dans le paramètre
url.Si votre application se connecte via Internet, activez l'endpoint public dans la console Lindorm : accédez à Database Connections > Wide Table Engine, puis cliquez sur Enable Public Endpoint dans l'onglet Wide Table Engine. Ensuite, spécifiez l'endpoint Internet LindormTable pour MySQL dans le paramètre
url.
Dimensionner le pool de connexions
Les nœuds frontal SQL de Lindorm utilisent Server Load Balancer (SLB) pour l'équilibrage de charge. Évitez de conserver les connexions pendant de longues périodes afin de répartir uniformément les requêtes. Configurez le paramètre phyMaxUseCount pour limiter la réutilisation des connexions.
Définissez
maxActiveavec la même valeur que la taille du pool de threads de votre application.Pour les charges de travail à haut débit et sensibles à la latence, définissez
minIdleavec la même valeur quemaxActiveafin que les connexions soient toujours prêtes.Pour les charges de travail présentant des fluctuations de trafic importantes, utilisez une valeur
minIdleplus faible pour réduire la consommation de ressources inactives.
Initialiser le pool de connexions
Chargez le fichier de configuration et créez la source de données :
// Load configuration from druid.properties.
Properties properties = new Properties();
InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
// Initialize the connection pool.
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Exécuter des opérations CRUD
Tous les exemples obtiennent une connexion depuis le pool et la restituent automatiquement grâce à l'instruction try-with-resources. Si vous n'utilisez pas try-with-resources, appelez explicitement conn.close() : cette action rend la connexion au pool, elle ne la ferme pas. Si une connexion devient invalide sans être restituée, Druid ne peut pas détecter cet état invalide.
String tableName = "sql_table_" + new Random().nextInt(1000);
// Create a table.
try (Connection connection = dataSource.getConnection()) {
try (Statement statement = connection.createStatement()) {
String sql = "create table if not exists " + tableName + "(id VARCHAR, name VARCHAR, primary key(id))";
int ret = statement.executeUpdate(sql);
System.out.println(ret);
}
}
// Insert a single row.
try (Connection connection = dataSource.getConnection()) {
String sql = "insert into " + tableName + "(id,name) values(?,?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.setString(2, "bb");
int ret = ps.executeUpdate();
System.out.println(ret);
}
}
// Batch insert.
String insertSql = "insert into " + tableName + "(id,name) values(?,?)";
int batchSize = 100;
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement ps = connection.prepareStatement(insertSql)) {
for (int i = 0; i < batchSize; i++) {
ps.setString(1, "aa" + i);
ps.setString(2, "bb" + i);
ps.addBatch();
}
ps.executeBatch();
}
}
// Query data.
try (Connection connection = dataSource.getConnection()) {
String sql = "select * from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
String id = rs.getString(1);
String name = rs.getString(2);
System.out.println("id=" + id);
System.out.println("name=" + name);
}
}
}
// Delete data.
try (Connection connection = dataSource.getConnection()) {
String sql = "delete from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.executeUpdate();
}
}
Dans Lindorm SQL,
INSERTest équivalent àUPSERT. Le client JDBC MySQL est optimisé pourINSERT; utilisez donc la syntaxeINSERTlors de l'écriture des données.Maintenez la valeur
batchSizeentre 50 et 100. Des lots plus importants peuvent provoquer des erreurs de mémoire insuffisante (OOM) ou un Full GC sur le serveur.Pour augmenter davantage le débit d'écriture, augmentez la concurrence en écriture.
Considérations pour la production
Gérer les interruptions de connexion
Dans des environnements réseau complexes, des interruptions de connexion peuvent survenir en raison de goulots d'étranglement au niveau de la passerelle, de jitter réseau ou d'une perte élevée de paquets. Les paramètres de keep-alive du fichier druid.properties aident à maintenir les connexions inactives, mais vous devez également implémenter un mécanisme de nouvelle tentative dans le code de votre application pour gérer les échecs temporaires.
Lorsque le serveur est mis à niveau et redémarré, les connexions actives peuvent être temporairement interrompues. Interceptez les exceptions et relancez l'opération.
Surveiller le pool de connexions
Vérifiez régulièrement les configurations effectives et les statistiques du pool de connexions, ainsi que les configurations dans les journaux :
druidDataSource.getStatData(); // Returns current pool statistics
druidDataSource.dump(); // Logs detailed pool configuration and state
FAQ
**Pourquoi mon application génère-t-elle l'erreur Read timed out ?**
Le délai d'attente socket par défaut dans Druid est de 10 secondes. Si une requête prend plus de temps, la connexion expire et cette erreur est générée. Définissez le paramètre socketTimeout en millisecondes dans l'URL JDBC. La valeur recommandée est 120000 (2 minutes) :
jdbc:mysql://<endpoint>:33060/<database>?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000