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>
< res-ref-name>jdbc/blog</res-ref-name>
< res-type>javax.sql.DataSource</res-type>
< res-auth>Container</res-auth>
< /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;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class Conexao {
public static Connection getConnection() throws Exception{
InitialContext context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/blog");
try {
return ds.getConnection();
} catch (SQLException e) {
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">
<Resource auth="Container"
driverClassName="com.mysql.jdbc.Driver"
maxActive="20" maxldle="10" maxWait="-1"
name = "jdbc/blog"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/blog"
username="camilo"
password="integrator" />
</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 {
private static final long serialVersionUID = 1L;
public TesteAPP() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Conexao.getConnection();
System.out.println("conexão estabelecida com sucesso");
} catch (Exception e) {
// TODO Auto-generated catch block
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! 🙂