Como usar DataSource em Java para gerenciar conexões?

O DataSource em Java é uma interface que gerencia conexões com o banco de dados de forma otimizada e segura, evitando abertura excessiva de conexões.

Como usar DataSource em Java para gerenciar conexões?

O DataSource é uma interface do JDBC que gerencia conexões com o banco de dados de forma eficiente, evitando desperdício de recursos e melhorando a performance da aplicação. Ao invés de criar novas conexões a cada requisição, o DataSource mantém um pool de conexões, reutilizando conexões já estabelecidas.

1. Por que Usar DataSource ao Invés de DriverManager?

O método tradicional de conexão com JDBC usa DriverManager, o que pode ser ineficiente para aplicações de grande escala, pois cada solicitação cria uma nova conexão:

Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost:3306/meubanco", "root", "1234");

Problemas do DriverManager:

  • Abre uma nova conexão a cada requisição, desperdiçando recursos.
  • Pode gerar lentidão devido ao tempo de abertura e fechamento de conexões.
  • Difícil de escalar em aplicações de alto tráfego.

2. Criando um DataSource com HikariCP

O HikariCP é um dos melhores pools de conexão para JDBC. Ele é rápido, eficiente e amplamente usado em aplicações Java.

Passo 1: Adicionar Dependência do HikariCP

Se estiver usando Maven, adicione ao pom.xml:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

Passo 2: Criar a Classe de Configuração do DataSource

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;

public class ConexaoDataSource {
    private static final HikariDataSource dataSource;

    static {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/meubanco");
        config.setUsername("root");
        config.setPassword("1234");
        config.setMaximumPoolSize(10); // Define o número máximo de conexões simultâneas
        dataSource = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

Explicação:

  • setMaximumPoolSize(10): Define o limite de conexões abertas simultaneamente.
  • HikariDataSource gerencia o pool de conexões e otimiza a reutilização.
  • getConnection() retorna uma conexão ativa do pool.

3. Utilizando o DataSource na Aplicação

Agora, podemos obter conexões sem precisar abrir novas instâncias do banco a cada requisição.

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ConsultaBanco {
    public static void main(String[] args) {
        String sql = "SELECT * FROM usuarios";

        try (Connection conexao = ConexaoDataSource.getConnection();
             PreparedStatement stmt = conexao.prepareStatement(sql);
             ResultSet rs = stmt.executeQuery()) {

            while (rs.next()) {
                System.out.println("Nome: " + rs.getString("nome"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Explicação:

  • O getConnection() obtém uma conexão do pool, sem precisar criar novas conexões.
  • As conexões são reutilizadas automaticamente, reduzindo o consumo de recursos.

4. Configurando DataSource com um Servidor de Aplicação (Tomcat)

Se estiver usando Tomcat, você pode configurar um DataSource no context.xml:

<Resource name="jdbc/MeuBanco" 
          auth="Container" 
          type="javax.sql.DataSource" 
          maxTotal="10" 
          maxIdle="5" 
          maxWaitMillis="10000" 
          driverClassName="com.mysql.cj.jdbc.Driver" 
          url="jdbc:mysql://localhost:3306/meubanco" 
          username="root" 
          password="1234"/>

E recuperar a conexão dentro da aplicação:

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MeuBanco");
Connection conexao = ds.getConnection();

5. Boas Práticas ao Usar DataSource

  • Evite abrir conexões diretamente com DriverManager.
  • Configure corretamente o tamanho do pool (maxPoolSize).
  • Monitore métricas de conexão para evitar esgotamento de recursos.
  • Feche a conexão após o uso para liberá-la para outros processos.

Conclusão

O uso de DataSource com HikariCP ou servidores de aplicação melhora a performance e escalabilidade das aplicações Java, reduzindo o consumo de recursos e otimizando o gerenciamento de conexões.

A adoção de pools de conexão, como o HikariCP, tornou-se essencial para aplicações modernas que demandam alta escalabilidade. Grandes empresas utilizam essa abordagem para garantir que seus sistemas lidem com milhares de requisições simultâneas sem sobrecarregar o banco de dados.

Algumas aplicações:

  • Melhoria na escalabilidade de aplicações web
  • Redução do tempo de resposta ao banco de dados
  • Otimização do consumo de recursos do servidor
  • Gerenciamento eficiente de conexões em microservices

Dicas para quem está começando

  • Evite abrir conexões diretamente com DriverManager
  • Utilize DataSource para gerenciar conexões de forma otimizada
  • Configure o tamanho do pool de conexões para evitar sobrecarga
  • Monitore métricas para detectar possíveis gargalos
  • Feche sempre a conexão após o uso para liberá-la para outros processos

Contribuições de Rodrigo Farias

Compartilhe este tutorial: Como usar DataSource em Java para gerenciar conexões

Compartilhe este tutorial

Continue aprendendo:

Como trabalhar com transações no JDBC

Trabalhar com transações no JDBC permite garantir a integridade dos dados, controlando commits e rollbacks de forma eficiente.

Tutorial anterior

O que é Hibernate e como ele facilita o acesso a banco de dados

O Hibernate é um framework ORM para Java que simplifica o acesso a bancos de dados, eliminando a necessidade de escrever SQL manualmente.

Próximo tutorial