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 |
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
maxActiveigual al tamaño del pool de hilos de su aplicación.Para cargas de trabajo sensibles a la latencia y con alto throughput, establezca
minIdleigual amaxActivepara que las conexiones estén siempre listas.Para cargas de trabajo con fluctuaciones significativas de tráfico, utilice un valor menor en
minIdlepara 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();
}
}
En Lindorm SQL,
INSERTequivale aUPSERT. El cliente JDBC MySQL está optimizado paraINSERT, por lo que debe usar la sintaxisINSERTal escribir datos.Mantenga
batchSizeentre 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