Todos los productos
Search
Centro de documentos

Lindorm:Develop applications using the Druid connection pool for Java

Última actualización: Sep 05, 2026

Utilice el pool de conexiones Alibaba Druid para conectarse a LindormTable mediante el endpoint compatible con MySQL.

Requisitos previos

Antes de empezar, asegúrese de cumplir con lo siguiente:

  • La función de compatibilidad con MySQL está habilitada en su instancia de Lindorm. Consulte Enable the MySQL compatibility feature

  • Tiene instalado JDK V1.8 o una versión posterior

  • La dirección IP de su cliente está agregada a la lista de permitidos de su instancia de Lindorm. Consulte Configure whitelists

Adición de dependencias

Agregue las siguientes dependencias al archivo pom.xml de su proyecto 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 utiliza druid-spring-boot-starter**, excluya el componente druid incluido y declare la dependencia de druid explícitamente:

<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>

Configuración del pool de conexiones

En el directorio src/main/resources de su proyecto Maven, cree el archivo druid.properties con el siguiente contenido:

# 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

Parámetros de conexión

Parámetro Descripción
url URL de conexión JDBC. Formato: jdbc:mysql://<LindormTable endpoint for MySQL>/<database name>?<connection settings>. Si omite el nombre de la base de datos, el cliente se conecta a la base de datos predeterminada. Para obtener detalles sobre todos los parámetros de conexión, consulte Connection settings.
username Nombre de usuario de LindormTable. Si olvidó la contraseña, restablézcala en el sistema de gestión de clústeres de LindormTable. Consulte Change the password of a user.
password
Importante
  • Si su aplicación se ejecuta en una instancia de Elastic Compute Service (ECS), utilice una conexión de virtual private cloud (VPC) para reducir la latencia y aumentar la seguridad. Especifique el endpoint VPC de LindormTable para MySQL en el parámetro url.

  • Si su aplicación se conecta a través de Internet, habilite el endpoint público en la consola de Lindorm: vaya a Database Connections > Wide Table Engine y haga clic en Enable Public Endpoint en la pestaña Wide Table Engine. A continuación, especifique el endpoint de Internet de LindormTable para MySQL en el parámetro url.

Dimensionamiento del pool de conexiones

Los nodos frontend de Lindorm SQL utilizan Server Load Balancer (SLB) para el balanceo de carga. Evite mantener conexiones abiertas durante periodos prolongados para distribuir las solicitudes uniformemente. Configure phyMaxUseCount para limitar la reutilización de conexiones.

  • Establezca maxActive igual al tamaño del pool de hilos de su aplicación.

  • Para cargas de trabajo sensibles a la latencia y con alto throughput, establezca minIdle igual a maxActive para que las conexiones estén siempre listas.

  • Para cargas de trabajo con fluctuaciones significativas de tráfico, utilice un valor menor en minIdle para reducir el consumo de recursos inactivos.

Inicialización del pool de conexiones

Cargue el archivo de configuración y cree el origen de datos:

// 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);

Ejecución de operaciones CRUD

Todos los ejemplos obtienen una conexión del pool y la devuelven automáticamente mediante try-with-resources. Si no utiliza try-with-resources, llame a conn.close() explícitamente; esto devuelve la conexión al pool, no la cierra. Si una conexión deja de ser válida sin haberse devuelto, Druid no podrá detectar dicho estado inválido.

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();
    }
}
Nota
  • En Lindorm SQL, INSERT equivale a UPSERT. El cliente JDBC MySQL está optimizado para INSERT, por lo que debe usar la sintaxis INSERT al escribir datos.

  • Mantenga batchSize entre 50 y 100. Los lotes más grandes pueden provocar errores de falta de memoria (OOM) o Full GC en el servidor.

  • Para aumentar aún más el throughput de escritura, incremente la concurrencia de escritura.

Consideraciones para producción

Manejo de interrupciones de conexión

En entornos de red complejos, pueden producirse interrupciones de conexión debido a cuellos de botella en la puerta de enlace, inestabilidad de la red o alta pérdida de paquetes. La configuración de keep-alive en druid.properties ayuda a mantener las conexiones inactivas, pero también debe implementar un mecanismo de reintento en el código de su aplicación para fallos transitorios.

Cuando el servidor se actualiza y reinicia, las conexiones activas pueden interrumpirse temporalmente. Capture las excepciones y reintente la operación.

Supervisión del pool de conexiones

Verifique periódicamente las configuraciones efectivas y las estadísticas del pool de conexiones, y revise las configuraciones en los registros:

druidDataSource.getStatData();  // Returns current pool statistics
druidDataSource.dump();         // Logs detailed pool configuration and state

Preguntas frecuentes

**¿Por qué mi aplicación genera el error Read timed out?**

El tiempo de espera del socket predeterminado en Druid es de 10 segundos. Si una consulta tarda más, la conexión agota el tiempo de espera y genera este error. Establezca socketTimeout en milisegundos dentro de la URL JDBC. El valor recomendado es 120000 (2 minutos):

jdbc:mysql://<endpoint>:33060/<database>?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&socketTimeout=120000