Dev (Back & Front)ARTIGO

Pool de conexão JEE – TomCat

Olá, pessoal!

Hoje vamos trabalhar com o pool de conexão,
veremos como usar em uma aplicação JEE. Apesar de ter o mesmo
efeito de fecharmos de forma programática, nem
sempre essa é melhor forma, principalmente em produção, quando uma
conexão pode ficar aberta, outra ser aberta depois e ir nesse caminho até estourar o seu Banco de Dados. E aí, para voltar ao normal, é preciso dar um
restart no tomcat. Imagine dar um restart no servidor em produção
por causa disso?

Até a implementação do pool de conexão é
bem lógica e bem refatorada, basta ter o JNDI e pronto. Quando
precisar alterar, vamos em um local e onde o JNDI é referenciado já
está atualizado (óbvio).

Lets go…

Pool de Conexão

O pool de conexão é usado do lado do servidor, independentemente da IDE
que você está usando. Porém, cada servidor e IDE têm suas configurações especiais para o uso do Pool, ou seja, no tomcat é de uma forma, no
Jboss é outra, no glassfish também é diferente. E na IDE Netbeans pode mudar,
pois ele organiza um projeto JEE levemente diferente da IDE eclipse.

Mãos à obra

01. Tomcat 5.5/superior:  antes de colocar mão na massa, certifique-se de que você conector
5.x.jar MySql, pois vamos precisar dele em nosso projeto JEE.

Crie
um novo dynamic web project.

Abra
o arquivo web.xml
e
na aba Tree clique em Resources.

Precisamos
adicionar uma referência. Para isso, clique em add e deixe conforme
abaixo:

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

O
name pode ser qualquer um, como jdbc/nomequevcquer.

Crie
um package para conexão br.com.conexao.

Agora,
crie uma classe chamada Conexao com o método a seguir:

import java.sql.Connection;<br />import java.sql.SQLException;<br />import javax.naming.InitialContext;<br />import javax.sql.DataSource;<br />public class Conexao {<br />public static Connection getConnection() throws Exception{<br />InitialContext context = new InitialContext(); <br />DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/blog");<br /> try {<br /> return ds.getConnection();<br />} catch (SQLException e) {<br />throw new Exception(e.getMessage());  }}}

O método lookup tem como objetivo buscar o jdni que criamos no
web.xml.

Configurando
o config BD no TomCat

Crie
um arquivo em META-INF chamado context.xml.

Aqui
vamos passar as configurações do BD para o JNDI que criamos, ou
seja, jdbc/blog. Vamos informar qual usuário/senha e schema do BD
aquele JNDI deve conectar.

<Context path="/PoolConexao"><br />    <Resource auth="Container"<br />    driverClassName="com.mysql.jdbc.Driver"<br />    maxActive="20" maxldle="10" maxWait="-1"<br />     name = "jdbc/blog"<br />     type="javax.sql.DataSource"<br />     url="jdbc:mysql://localhost:3306/blog"<br />     username="camilo"<br />     password="integrator" /><br /></Context>

Podemos ter vários JNDI em um mesmo context.xml, com usuários/senha
+ schema diferentes. Isso ajuda quando é necessário fazer alterações
de teste para produção, basta mudar em um lugar. E pronto.


A
JNDI é uma API para acesso a serviços de diretórios que permite
aplicações cliente descobrir e obter dados ou objetos através de
um nome. A API JNDI é utilizada em aplicações Java para acessar
recursos externos, como banco de dados, filas ou tópicos JMS e
componentes da plataforma Java EE (Edson Gonçalves).

Adicione
ao projeto o driver do BD na pasta lib. Lembre-se de copiá-lo
fisicamente para o eclipse, ou seja, saia do eclipse e copie o .jar,
pois o eclipse não faz isso automaticamente quando add via library
da própria IDE.

Testando

Para
testar, vamos criar um simples servlet que vai estabelecer a conexão
e, se der tudo tudo certo, não veremos nenhuma exceção e será
impressa uma mensagem.

Mas,
antes disso, vamos criar uma página .jsp que chama o servlet. Fizemos isso
para ser mais rápido e simples, já que precisamos apenas saber se
o nosso pool está funcionando corretamente.


Servlet.java

Crie
um package br.com.servlet.

Crie
um servlet TesteAPP, conforme abaixo:

 public class TesteAPP extends HttpServlet {<br />private static final long serialVersionUID = 1L;<br />public TesteAPP() {<br />super();<br />// TODO Auto-generated constructor stub<br />}<br />protected void doGet(HttpServletRequest request, HttpServletResponse response)<br />throws ServletException, IOException {<br />try {<br />Conexao.getConnection();<br />System.out.println("conexão estabelecida com sucesso");<br />} catch (Exception e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();}}

Nota:
Se você usou o assistente do eclipse para criar um servlet, fique
atento se não mudou o <url-pattern>. Caso não tenha feito, ele leva o mesmo nome da class Servlet.

Index.jsp

Apenas
encaminhe a solicitação para o servlet TesteAPP. Execute o
projeto, e veja o resultado esperado.


Nota:

Não se esqueça de verificar se o Banco de dados foi iniciado. Ou
seja, deu start no BD? Se não, você vai receber uma exceção:
Communication failure link.

Simples,
não? Vou ficando por aqui e espero que tenham gostado!

Abraços,
see you! 🙂

é Bacharel em Sistemas de Informação e Especialista em Gestão e Estratégia de Negócios. Trabalha com TI desde 2003 e possui as certificações SCJP 5 e SCM. Trabalhou na IBM Brasil como Analista Programador Java, passou pelo laboratório da Enterprise Computing Lab (ECL) HP como Software Engineer, Ci&amp;T como Engenheiro de Software em projeto JEE. Tem experiência internacional em Índia, Dubai e Londres. Atualmente é cofundador da ITSLabs (www.itslabs.com.br), uma start-up focada na criação de produtos web e mobile para start-ups. Também é autor dos livros "Guia do Exame SCJP", "Guia Prático JEE com Frameworks" e "TDD na prática".

Ver perfil