JNDI com Hibernate – Ambiente de Test

Olá Pessoal,

No post de hoje, vou apresentar como usar JNDI dentro do seu arquivo hibernate.cfg.xml dentro de um ambiente de teste. Em outro post falarei como usar em um ambiente de produção e ver que fica mais fácil realizar mudanças nas conexões de modo mais fácil, uma vez que normalmente o ambiente de teste possui configurações levemente diferente do ambiente de produção desde nome do usuário, até o path do BD.

Lets go…

Starting/Nosso Cenário

Eu já falei aqui no blog sobre pool de conexão no TomCat e JNDI, porém não falei como usar o JNDI dentro do Hibernate.

Aqui veremos isso com um framework bem utilizado no mercado que é o Hibernate.

Mas, a pergunta que você pode está fazendo: “Camilo, por que eu usaria isso?”, “Qual a diferença na pratica?”

Como sempre gostei de ser mais pratico e menos teorico, eu também tive essa dúvida rs. Porém, descobrir a grande produvidade quando tive 6 projetos diferentes para Produção e sempre quando tinhamos um release, era fato de esquecer de mudar o hibernate.cfg.xml, para as conexões de produção, fora que toda vez já era um saco, porque tinha que configurar sempre no ambiente de desenvolvimento antes de enviar para prod.

Enfim, na pratica você só vai configurar em um lugar as config de conexão, em um único arquivo e mais nada. E o melhor, quando for pra PRODUÇÃO, veremos que lá temos outro arquivo JNDI só para PROD, que normalmente não tem porque mudar com frequência. E nos desenvolvedores precisamos apenas saber o JNDI correto, e o administrador do Servidor que se vire lá com as configs, do arquivo de conexão em produção. Isso é extremamente importante, trabalhei em um projeto do qual nos desenvolvedores não tinhamos acesso as senhas, pw de produção, somente os administradores, para nos o que importava era apenas o path do JNDI e mais nada. Para quem trabalha fazendo todos os papeis (isso lembra meu tempo de freelance rs) desenvolvedor,administrador, DBA, isso parece ser estranho, mas em projetos grandes que participei na IBM , não é assim que funciona. Desenvolvedor é desenvolvedor,Testador é testador e por ai vai. E em ambiente teste você tem até acesso ao BD, PW etc. Mas, em produção. Not.

Hoje estarei limitado ao ambiente de teste, porque no ambiente de produção há algumas mudanças significativas e quero deixar o post focado à um assunto.

Nosso projeto

Criei um projeto muito simples, pois a funcionalidade está no uso de JNDI com Hibernate em teste. Não passa de um projeto com JSF + Hibernate. Porém,vc pode configurar isso em qualquer projeto com Hibernate para que ele funcione com JNDI.


Primeiro passo:

É configurar o arquivo web.xml do seu projeto com o nome do JNDI que deseja, pode ser o nome do seu cachorro, da sua namorada, o que você quiser.

<resource-ref>

<res-ref-name>jdbc/lpjava</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

Segundo passo:

Após ter configurado o web.xml, informando que a conexão para o BD estará naquele path. Vamos configurar o nosso JNDI, com os dados de conexão. Em ambiente de teste, vamos configurar o arquivo context.xml que está na pasta Server do Eclipse. É nele que vai estar as config locais. Insira dentro da tag Context o Resource abaixo:

<Resource auth=“Container”

name=“jdbc/lpjava”

driverClassName=“com.mysql.jdbc.Driver”

maxActive=“20” maxIdle=“10” maxWait=“-1”

type=“javax.sql.DataSource”

url=“jdbc:mysql://localhost/apptestes”

password=“lpjava”

username=“camilolopes”

validationQuery=“SELECT 1”

testOnBorrow=“true”

testWhileIdle=“true”

timeBetweenEvictionRunsMillis=“10000”

minEvictableIdleTimeMillis=“60000” />

Observe que informamos o nome do JNDI, que este tem referencia.

Terceiro passo:

Feito isso, vamos informar ao Hibernate que ele vai usar uma conexão JNDI, para o Hibernate o que importa é o path, se amanha você muda a senha de conexão vai precisar alterar apenas o arquivo context.xml que está na pasta Server dentro do Eclipse, lembrando que isso em ambiente de teste. Abaixo como ficou meu arquivo hibernate.cfg.xml

<hibernate-configuration>

<session-factory name=“hibernate/SessionFactory”>

<property name=“hibernate.connection.datasource”>java:/comp/env/jdbc/lpjava</property>

<property name=“hibernate.current_session_context_class”>thread</property>

<property name=“hibernate.transaction.factory_class”>org.hibernate.transaction.JDBCTransactionFactory</property>

<property name=“hibernate.dialect”>org.hibernate.dialect.MySQL5InnoDBDialect</property>

<property name=“hibernate.jdbc.batch_size”>0</property>

<mapping class=“br.com.camilolopes.bean.TUsuario”/>

</session-factory>

</hibernate-configuration>

Quem usa o Hibernate ou está começando vai ver que não temos mais a property para o password ou user, uma vez que há uma referencia para um path, onde este tem referencia para um arquivo (context.xml) onde está de fato nossa conexão.

Finalizando

Teste sua aplicação, mande executar e faça uma persistencia, porem não deixe de verificar se já deu um start no banco de dados, se todos os .jars referente ao Hibernate estão no projeto e no caso do Eclipse olhe se está fisicamente na pasta lib do projeto.

Vou ficando por aqui, espero que tenham gostado do post.

Abracos, see ya guys!!! 🙂

Dica Linux para notebooks CCE

UbuntuStrapVertLoco

ae!! Pessoal,

Hoje passei o dia tentando colocar o Linux em um notebook CCE para montar um ambiente JEE, mas que dor de cabeça deu.Pois, o notebook CCE tem alguma coisa na parte de hardware que não faz o S.O carregar de forma automatica, primeiro que precisamos mudar toda hora o setup. E se for usar o Windows XP, este nao dar suporte HD SATA e tem que mudar para IDE no setup do note. E vi no forum do Ubuntu vários posts relacionado entre Linux & CCE. E alguns nem encontraram a solução, pois isso varia muito do modelo, apesar que a CCE tem um site muito bom, com FAQ excelente, e varias dicas que dar para resolver por lá mesmo, fora o suporte no tel que é eficiente. Isso é dificil de encontrar em outras marcas. Mas, vamos lá. Se vc tem algum modelo informado na lista da CCE, e quer instalar o Ubuntu, vc pode seguir os passos descritos por eles, ou usar a distribuição Ubuntu 10.x/superior que nao vai precisar mudar nada no SETUP e vai rodar normal. Eu fiz alguns destes com o Ubuntu desde da versão 8-9 e nao tive sucesso, mas com o Ubuntu 10 foi normal, sendo assim suspeito que as distribuições anteriores que estão ‘bugadas’ e não o notebook da CCE. Pois, se vc tiver o CD 10.x verá que vai rodar tudo normal, sem precisar seguir as dicas da CCE.

Então fica a dica ai para quem quer ter o pinguim em um note CCE.

P.S: Agora minha vida eh do lado do Pinguim aqui na 4Linux, aquela frase : “casa de ferreiro, espeto de pau” não faz parte da cultura da empresa, é software livre 100% por aqui, recebi meu note e primeira coisa a fazer foi remover o Win que veio e instalar uma distribuição Unix (Debian,Fedora ou Ubuntu).Acho que já estou fazendo amizade com o pinguim. Eramos apenas colegas.

abracos,

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. :).

org.hibernate.Session Hibernate Solução Eclipse

olá Pessoal,

Hoje vou apresentar um pequeno probleminha que alguns já passaram usando o hibernate. Porém, o problema não é do framework e sim do Eclipse que não importa os .jars quando este é adicionado usando library da própria IDE. A situação é bem simples: “o programador está convicto que tudo está OK, nao falta nenhum .jars, os imports correto etc.” Mas, ao executar aplicação e tentar salvar algo no BD, recebe uma exceção org.hibernate.Session.

Neste post vou mostrar aonde está o problema.

Lets go…

O problema

Como relatei o problema é na IDE Eclipse que ela nao faz os imports dos .jars que você adicionou ao projeto usando library. Que na verdade os .jars deveriam está na pasta lib do seu projeto fisicamente. Porém não é isso que acontece. Experimente ir na pasta lib do seu projeto e veja se vai ver algum .jar do hibernate. Acredito que não e por isso temos essa exceção em um caso como esse.

Abaixo olha os testes que e fiz e como solucionei (acredito que você já sabe como é):

Criei um projeto simples, que cadastra um cargo no BD. Somente para mostrar o problema.

  1. Vamos felizes da vida tentar cadastrar uma novo cargo

  2. Olha que beleza:

  3. Vamos ver o que temos na pasta lib do meu projeto:

  4. Bem,  Não vejo meus arquivos .jars do hibernate que adicionei ao projeto. Onde estão sr. Eclipse? Esse é o problema do Eclipse, nos adicionamos os ,jars e ele nao copia fisicamente os .jars para a pasta lib. Isso dar certo quando é projeto não é  JEE. Como falei neste post.

  5. A solução, é copiar os .jars veja:

  6. Agora vamos testar app novamente

  7. Verificando no meu BD ver:

Pronto, resolvido o problema! Bem, Nem sempre a exceção com hibernate.session está relacionada com a falta dos .jars, as vezes é erro de programação mesmo. Mas, quando você está certo dos seus codes e está usando o Eclipse, não esqueça de ir a pasta lib do projeto e verificar se os .jars do Hibernate realmente estao no seu projeto.

Vou ficando por aqui, espero que a dica tenha ajudado quem está passando por essa situação, eu ja mandei uma nota para equipe do Eclipse, mas eles disseram que isso não é um bug da IDE. Bem, o NetBeans não  tem isso, todas as libraries adicionadas ao projetos, temos os .jars fisicamente no projeto. Então, será que não é uma falha do nosso querido Eclipse? Eu ja reclamo disso desde da versão antes Galileo.

Abracos, see you next post.