Powered by Max Banner Ads 
Home > JavaEE > Criando um pool de conexão JEE/TomCat

Criando um pool de conexão JEE/TomCat

olá Pessoal,

O post desta semana é sobre pool de conexão, veremos como usar em uma aplicação JEE. Apesar de ter o mesmo efeito de fecharmos de forma programatica uma conexão, mas nem sempre esta ultima é melhor, principalmente em produção uma conexão pode ficar aberta, outra vem a ser aberta e por ai vai até estourar o nosso BD. E para retornar o normal tem que ter dar um restart no tomcat. Imagine em dar um restart no servidor em produção por causa disso?

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

Lets go…

Posts recomendados:

MySql + Java

Criando dynamic web project

Pool de Conexão

O pool de conexão é usado do lado do servidor independente da IDE que você está usando, porém cada servidor e IDE tem suas config especiais para o uso do Pool, ou seja, no tomcat é de uma forma, no Jboss eh outra, no glassfish também. E na IDE Netbeans pode mudar, que ele organiza um projeto JEE levemente diferente da IDE eclipse. Mas, nada que o programador precise “comprar um livro” para esse fim.

Requisitos:

Tomcat 5.5/superior – Instalação

Eclipse
MySql – 5.x

Antes de colocar mão na massa certifique-se que você tem o conectar 5.x.jar MySql . Pois, vamos precisar dele em nosso projeto JEE.

  1. crie um novo dynamic web project
  2. Abra o arquivo web.xml e na aba Tree clique em Resources.
  3. Precisamos adicionar uma referência para isso clique em add e deixe conforme abaixo:

< resource-ref>
    < res-ref-name>jdbc/blog
    < res-type>javax.sql.DataSource
    < res-auth>Container
  < /resource-ref>
  1. O name pode ser qualquer um, como jdbc/nomequevcquer
  2. crie um package para conexão br.com.conexao

  3. 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());
		}}}
  1. o método lookup tem como objetivo buscar o jdni que criamos no web.xml

Configurando o config BD no TomCat

  1. crie um arquivo em META-INF chamado context.xml
  2. 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.


	

Então podemos ter vários JNDI em um mesmo context.xml com usuários/senha + schema diferentes. Isso ajuda quando precisar 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 copia-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á impresso uma mensagem.

Mas, antes disso criamos uma pagina .jsp que chama o servlet. Fizemos isso para ser mais rápido e e simples. Já que precisamos apenas saber se o nosso pool está funcionando corretamente.

Servlet.java

  1. crie um package br.com.servlet

  2. 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();}}

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

Index.jsp

Apenas encaminha a solicitação para o servlet TesteAPP

Execute o projeto, e veja o resultado esperado.



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

Simples não? Vou ficando por aqui e espero que tenham gostado do post.

Abraços, see you next post. :) .

Related Posts with Thumbnails
  1. Rafael
    May 22nd, 2010 at 12:59 | #1

    Olá.

    Qual é a certificação minima para java?

  2. camilolopes
    May 24th, 2010 at 03:03 | #2

    olá Rafael,

    O que seria uma certificacao minima para java? A certificacao de menor nivel se eh isso que deseja saber é a SCJA, porem por ser de menor nivel nao quer dizer que nao eh importante pelo contrario, quando vai se fazer as de niveis mais elevados como a de arquiteto cai assuntos desde da SCJA quanto da SCJP etc.
    abracos

  3. Andre Rosenweiss
    September 15th, 2010 at 21:55 | #3

    Parabéns de novo Camilo, estava com algumas dúvidas sobre esse tema e seu artigo me ajudou muito!

  4. November 2nd, 2010 at 09:28 | #4

    Esse artigo seria perfeito, se tivesse publicado o código do index.jsp.

  5. camilolopes
    November 5th, 2010 at 21:48 | #5

    vou atualizar, isso foi feito, mas o plugin, acabou comendo ele, odeio esses plugins de formatacao de code. nao dar certo qdo tem algo com tags HTML

  6. marcilio
    February 8th, 2011 at 08:18 | #6

    Camilo,
    Estou usando Eclipse Ganymede com tomcat, mas ao criar “add resource reference” ao invés de referenciar com o código.

    jdbc/blog
    javax.sql.DataSource
    Container

    criou:

    jdbc/blog
    javax.sql.DataSource

    e ao testar a classe TesteAPP, manda o seguinte erro.

    javax.naming.NamingException: Cannot create resource instance
    at org.apache.naming.factory.ResourceEnvFactory.getObjectInstance(ResourceEnvFactory.java:114)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:152)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at br.com.bb.conexao.Conexao.getConnection(Conexao.java:13)
    at br.com.bb.conexao.servlet.TesteAPP.doGet(TesteAPP.java:23)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:619)

    TEM COMO AJUDAR?

  7. camilolopes
    February 10th, 2011 at 00:53 | #7

    as suas configuracoes no arquivo xml estao corretas? se seu arquivo context.xml nao estiver correto, nao terá sucesso.

    flw.

  8. rodolfo
    October 7th, 2011 at 18:03 | #8

    Camilo,

    Gostaria de saber se por acaso vc teria a definiçao do item abaixo:

    “Configurando o config BD no JBOSS”

    Agradeço sua ajuda

  9. camilolopes
    October 10th, 2011 at 21:37 | #9

    olá Rodolfo,

    Com Jboss eu não sei ti informar, pq nunca brinquei com ele, mas na documentação do servidor teve ter algo. pesquisei rapido aqui e achei isso: http://javafree.uol.com.br/topic-11110-Pool-de-conexoes-no-JBoss.html sempre alguem ja passou pelos nossos problemas hehe :)
    abracos,

  10. Raul
    December 4th, 2011 at 22:30 | #10

    Como faço para relacionar duas tabelas no mysq, cujo bancos de dados estão separados em pelo menos 2 máquinas.

    ex: em um computador tenho só banco de dados com as vendas.
    em outro computador tenho cadastro de clientes. Quero relacionar as duas, lembrando ainda que usuario e senha podem ser distintos nas máquinas. Tem como fazer isso no Hibernet também?