O Druid é um pool de conexões Java Database Connectivity (JDBC). Este tópico demonstra como se conectar ao LindormTable com o Druid e executar operações básicas de CRUD.
Pré-requisitos
Antes de começar, verifique se você tem:
Java Development Kit (JDK) 1.8 ou posterior instalado
Lista de permissões configurada para sua instância do Lindorm. Consulte Configure whitelists
LindormTable 2.3.1 ou posterior. Para atualizar, consulte Upgrade the minor engine version of a Lindorm instance
Observações de uso
Ciclo de vida da conexão
Os nós de frontend do Lindorm usam o Server Load Balancer (SLB) para balanceamento de carga. Para distribuir as requisições uniformemente entre esses nós, evite manter conexões abertas por longos períodos. Defina os parâmetros phyMaxUseCount e phyTimeoutMillis para controlar a duração das conexões.
Após cada consulta, chame conn.close() para devolver a conexão ao pool. Se uma conexão não for devolvida e se tornar inválida, o Druid não detectará esse estado.
Resiliência
Em ambientes de rede complexos, interrupções de conexão podem ocorrer devido a gargalos de gateway, instabilidade na rede, altas taxas de retransmissão ou perda de pacotes. Configure o pool de conexões adequadamente e implemente lógica de nova tentativa no código da aplicação.
Durante atualizações ou reinicializações do servidor, as conexões podem ser interrompidas temporariamente. Mesmo com um pool de conexões, a aplicação pode gerar exceções. Capture essas exceções e implemente novas tentativas.
Observabilidade
Monitore o pool de conexões com DruidDataSource#getStatData() e DruidDataSource#dump(). Chame esses métodos periodicamente para validar as configurações, confirmando se phyMaxUseCount e phyTimeoutMillis estão reciclando conexões e corrigindo desequilíbrios de carga.
Adicionar dependências
Adicione o seguinte ao arquivo pom.xml do projeto Maven. Baixe o código de exemplo para executar um exemplo funcional localmente.
Configuração padrão do Maven
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>com.aliyun.lindorm</groupId>
<artifactId>lindorm-all-client</artifactId>
<version>2.2.1.3</version>
</dependency>
Configuração do Spring Boot Starter
Ao usar o druid-spring-boot-starter, exclua o componente druid incluído e adicione a versão explícita separadamente. Essa ação evita conflitos de versão entre o Druid integrado ao starter e o Lindorm JDBC Driver.
<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>com.aliyun.lindorm</groupId>
<artifactId>lindorm-all-client</artifactId>
<version>2.2.1.3</version>
</dependency>
Conectar-se ao LindormTable
Etapa 1: Configurar o pool de conexões
Em src/main/resources, crie o arquivo druid.properties com o conteúdo a seguir. Os parâmetros dividem-se em três categorias:
Substitua pelos seus valores — obrigatório antes da conexão da aplicação
Ajuste para sua carga de trabalho — modifique conforme a concorrência e o hardware
Mantenha como está — os padrões são otimizados para o LindormTable; alterações podem causar erros
# ── Replace with your values ─────────────────────────────────────────────────
# Driver class name — do not change this value.
driverClassName=com.aliyun.lindorm.table.client.Driver
# Endpoint for LindormTable. Get the value from the Lindorm console.
# See: https://www.alibabacloud.com/help/en/lindorm/user-guide/connect-to-an-apsaradb-for-lindorm-instance#section-xi3-1q0-gv0
url=jdbc:lindorm:table:url=http://ld-bp17j28j2y7pm****.lindorm.rds.aliyuncs.com:30060
# Username and password for LindormTable.
# View or reset credentials in the LindormTable cluster management system.
# See: https://www.alibabacloud.com/help/en/doc-detail/174671.html#topic2090
# To change your password, see: https://www.alibabacloud.com/help/en/doc-detail/174671.html#section-n3z-64v-v73
username=****
password=****
# Target database to connect to.
connectionProperties=database=****
# ── Tune for your workload ────────────────────────────────────────────────────
# Number of connections created at startup.
initialSize=10
# Minimum number of idle connections.
# For high-throughput scenarios, set this equal to maxActive.
# For workloads with significant traffic spikes, use a smaller value.
minIdle=40
# Maximum number of active connections.
# Set this to match your thread pool size.
maxActive=40
# Maximum usage count per connection before it is recycled.
# Recycling connections periodically prevents load imbalance across LDServer nodes.
druid.phyMaxUseCount=10000
# ── Keep as-is ────────────────────────────────────────────────────────────────
# Initialize the pool on startup.
init=true
# Maximum wait time (ms) to acquire a connection from the pool.
maxWait=30000
# Connection keep-alive settings.
# Changing these may cause unexpected disconnections (ConnectionDisconnectedException).
druid.keepAlive=true
druid.keepAliveBetweenTimeMillis=30000
minEvictableIdleTimeMillis=300000
maxEvictableIdleTimeMillis=600000
timeBetweenEvictionRunsMillis=5000
# Maximum connection lifetime (ms) before recycling.
# Together with phyMaxUseCount, this periodically refreshes connections
# to prevent uneven distribution across frontend nodes.
phyTimeoutMillis=1800000
# Connection validation settings.
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
# Prepared statement cache — disabled to avoid NoSuchStatement errors.
poolPreparedStatements=false
maxOpenPreparedStatements=-1
druid.maxPoolPreparedStatementPerConnectionSize=-1
Para obter a lista completa de parâmetros de configuração do Druid, consulte Configuração do DruidDataSource.
Etapa 2: Inicializar o pool de conexões
Carregue o arquivo druid.properties e crie o DataSource:
// 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);
Etapa 3: Executar operações de CRUD
Todos os exemplos abaixo obtêm uma conexão do pool com dataSource.getConnection() e a devolvem via try-with-resources. Use PreparedStatement para consultas parametrizadas e evitar injeção de SQL.
Criar uma tabela
String tableName = "sql_table_" + new Random().nextInt(1000);
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);
}
}
Inserir dados
try (Connection connection = dataSource.getConnection()) {
String sql = "upsert 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);
}
}
Consultar dados
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);
}
}
}
Excluir dados
try (Connection connection = dataSource.getConnection()) {
String sql = "delete from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.executeUpdate();
}
}
Apêndice: Como funciona o balanceamento de carga do pool de conexões
O Druid usa conexões persistentes TCP. Embora mais eficientes que conexões efêmeras, elas podem causar distribuição desigual de carga entre os nós LDServer em dois cenários:
Criação de conexões em rajada
Se a aplicação criar muitas conexões rapidamente, o SLB pode não atualizar as estatísticas dos nós de backend com rapidez suficiente. Alguns nós LDServer acabarão lidando com mais conexões, o que aumentará a pressão sobre eles.
Anomalias no health check
O SLB usa health checks ativos para detectar nós de backend não saudáveis. Falhas transitórias no health check podem fazer com que alguns nós LDServer recebam menos novas conexões, reduzindo a utilização nesses nós.
Solução
Os parâmetros phyTimeoutMillis e phyMaxUseCount do Druid reciclam periodicamente as conexões no pool (por exemplo, após 30 minutos ou 10.000 execuções). Isso força o pool a redistribuir as conexões entre os nós de backend ao longo do tempo, resolvendo ambos os cenários sem sacrificar o throughput. Adicione ambos os parâmetros à sua configuração por padrão.
Para confirmar se os parâmetros estão surtindo efeito, chame DruidDataSource#getStatData() e DruidDataSource#dump() periodicamente e verifique se as conexões estão sendo recicladas nos intervalos esperados.