Como configurar um pool de conexões no Apache Tomcat

Filed Under (Banco de dados, Servlet/JSP, Tutoriais) by Antonio Passos on 28-03-2008


Observação 01:
Este tutorial ensina como criar um pool de conexões no Apache Tomcat. Para tanto, usa como exemplo o banco de dados Mckoi criado no tutorial Mckoi SQL Database em perguntas e respostas.

Observação 02:
Você deve ter uma cópia do driver do banco de dados do pool no diretório "lib" do Apache Tomcat.

Observação 03:
Não é necessário adicionar o driver do banco de dados à aplicação, muito menos colocar uma cópia em seu diretório /WEB-INF/lib.
 

1)Configurando o pool de conexões…

No diretório META-INF da aplicação, crie um arquivo "context.xml" com o seguinte conteúdo…

<?xml version="1.0" encoding="UTF-8"?>
<Context auth="Container">
<Resource
name="jdbc/bd_teste"
type="javax.sql.DataSource"
url="jdbc:mckoi://localhost:59999/"
driverClassName="com.mckoi.JDBCDriver"
username="admin"
password="123456"
maxActive="100"
maxIdle="20"/>
</Context>

Significado de cada atributo usado no arquivo "context.xml"…

  • auth –> Atribui ao Apache Tomcat a responsabilidade de gerenciar a abertura e o fechamento das conexões 
  • name –> Nome dado ao pool de conexões. Deve obedecer o formato JNDI

    ATENÇÃO: O NOME DADO AO POOL DEVERÁ SER O MESMO USADO NO ARQUIVO WEB.XML DA APLICAÇÃO.

  • type –> Especifica o tipo como sendo DataSource
  • url –> Especifica a localização do banco de dados. Deve obedecer o formato URL JDBC
  • driverClassName –> Nome da classe do driver JDBC do banco de dados
  • username –> Nome do usuário do BD
  • password –> Senha do usuário do BD
  • maxActive –> Número máximo de conexões ativas no pool
  • maxIdle –> Número máximo de conexões inativas no pool
  • maxWait –> Tempo máximo de espera por uma conexão, em milissegundos

2)Registrando o pool no aplicativo…

No arquivo "web.xml" da aplicação, insira as linhas abaixo…

  <resource-ref>
      <res-ref-name>
          jdbc/bd_teste
      </res-ref-name>
      <res-type>
          javax.sql.DataSource
      </res-type>
      <res-auth>
          Container
      </res-auth>
  </resource-ref>

ATENÇÃO: O valor em "<res-ref-name>" deve corresponder ao nome dado ao pool de conexões no arquivo "context.xml". No caso a "jdbc/bd_teste".

3)Testando o pool..

3.1) Crie uma classe "ServiceLocator.java" com o seguinte conteúdo…

import java.sql.Connection;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class ServiceLocator {

    public static Connection getConexao(String JNDINome) throws Exception {
        Connection con = null;

        // Obtém a raiz da hierarquia de nomes
        InitialContext contexto = new InitialContext();

        // Obtém a origem dos dados
        DataSource ds = (DataSource)contexto.lookup("java:comp/env/" + JNDINome);

        // Obtém uma conexão
        con = ds.getConnection();

        // Retorna a conexão
        return con;
    }
}
 
3.2) Crie um servlet, que use a classe ServiceLocator acima para obter uma conexão do pool…

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

 public class ServletExemplo extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

    private static final String JNDINome = "jdbc/bd_teste";
   
    public ServletExemplo() {
        super();
    }       
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Filmes cadastrados</h1>");
        
        Connection con = null;
        try {
            con = ServiceLocator.getConexao(JNDINome);
        } catch (Exception e) {
            e.printStackTrace();
        }

        String sql = "SELECT * FROM filmes";
        PreparedStatement stmt;
        try {
            stmt = con.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()){
                out.println("Código -> " + rs.getInt(1) + " Título -> " + rs.getString(2));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Leia também estes posts...


    Comments:

    Post a comment