Tous les produits
Search
Centre de documentation

Lindorm:Develop applications using the Druid connection pool for Java

Dernière mise à jour :Aug 11, 2026

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 :

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
Important
  • 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 maxActive avec 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 minIdle avec la même valeur que maxActive afin que les connexions soient toujours prêtes.

  • Pour les charges de travail présentant des fluctuations de trafic importantes, utilisez une valeur minIdle plus 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();
    }
}
Remarque
  • Dans Lindorm SQL, INSERT est équivalent à UPSERT. Le client JDBC MySQL est optimisé pour INSERT ; utilisez donc la syntaxe INSERT lors de l'écriture des données.

  • Maintenez la valeur batchSize entre 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