Todos os produtos
Search
Central de documentação

Lindorm:Use Druid to develop applications

Última atualização: Jun 28, 2026

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:

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.