Solucionando Communication link failure Hibernate com Pool + Mysql

olá Pessoal,

Hoje vou apresentar como resolver o problema abaixo quando temos nossa aplicação em produção e onde apostaríamos tudo que estava ok, pois em teste vc nunca tinha visto à exceção a seguir. Mas, pq em produção ela aparece e o cliente liga dizendo que está dando erro?

Bem, eu sofri muito com essa exceção, pesquisei bastante e vi várias dicas porém nenhuma delas eu conseguia resolver, dai conversando com Edson Gonçalves o mesmo me passou dois links importantes o qual encontrei a solução um está em inglês e outro é da Caelum explicando o outro problema que é broken pipe que é bem comum aparecer.

Lets go..

Posts Relacionado:

Mas, Por que temos essa exceção em PRODUÇÃO?

hibernateexcecaopool

A resposta é bem simples, se a conexão com seu banco ficar inativo por mais de 8 horas no caso do MySql, então o banco mata a conexão. E quando o cliente usando o pool de conexão tenta usar, já eh tarde demais.

Solucionando

Aqui estou usando o pool de conexão que é required em qualquer aplicação JEE, até por questão de manutenção, porém vou limitar o code apenas para meu arquivo context.xml.

Portanto abra seu arquivo META-INF/context.xml que faz o pool de conexão que você deve deixa-lo como o código a seguir:


  

 


Depois disso, manda o xml para produção, dar um restart no servidor e testa. Aqui resolveu. Até que fim.

o código anterior era assim:


  

 

Bem, espero que o post tenha ajudado, resolvi fazer esse post tendo como referencia o post em ingles, devido durante as minhas pesquisas não achei nada em português tão objetivo e direto para resolver o problema, só encontrava, discussões e opiniões de como poderia ser resolvido, mas nada de resolver. Agora já temos :). Mas, não se esqueça que isso tem efeitos apenas em produção.

abraços, see ya!!

Hibernate com Pool de Conexão

Olá Pessoal,

Hoje o post é bem simples, na verdade considero este como uma continuação do post sobre pool de conexão. Vou mostrar aqui como fazer hibernate usar o pool de conexão através de uma JNDI. Então será um post bem pequeno, já que vou adicionar apenas as informações referente ao arquivo hibernate.cfg.xml. Se quer comecar do zero, veja o post anterior.

Lets go…

Configurando

  1. Certifique-se que você tem no seu projeto o arquivo context.xml e web.xml configurado corretamente.

  2. Tanto faz se seu projeto é JSF Project ou Dynamic Web Project desde que seja para plataforma JEE.

  3. Não esqueça de adicionar os .jars do hibernate ao seu projeto, se tem dúvida veja neste post.

  4. Agora vamos para a parte mais simples, configurar o arquivo hibernate.cfg.xml. Então deixe seu arquivo conforme abaixo:




java:/comp/env/jdbc/blog
thread
org.hibernate.transaction.JDBCTransactionFactory
org.hibernate.dialect.MySQL5InnoDBDialect
0



 

Pronto observe que agora seu arquivo de configuração do hibernate ele “aponta” para o JNDI que criamos, e quando o schema ou caminho do BD mudar, vamos apenas alterar lá no JNDI e o hibernate já pega a nova informação. Simples não?

Abracos, espero que tenham gostado do post.

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

Solucionado ROLE_ Spring Security

Olá Pessoal,

O post de hoje vem com o objetivo de complementar dois posts do Edson Gonçalves referente Spring Security. Muitos desenvolvedores que pretende usar Spring Security (SS) em suas apps JEE para implementar a regra de segurança sofrem quando já temos dados cadastrado no BD e não queremos mudar as informações no BD para prefix o ROLE_ que é requerido pelo SS.

Neste post vou mostrar como resolver este problema, que você pode se deparar em sistema legado.

Lets go…

Recomendado:

Spring Security + BD

Spring Security Sem BD

Iniciando

Vou levar em conta que você ja tem implementado o SS conforme este post do Edson Gonçalves. Caso contrário leia o post do Gonçalves antes de continuar com o meu.

Mas, para refrescar sua mente lembre-se que o role deve ter ROLE_ prefixado para que as regras funcionem. Isso é default no SS. Há como alterar, porém pesquisei muitooo e não conseguir implementar, no forum SS há varias sugestoes, mas nenhuma delas foi mais eficiente que prefix o ROLE_ com os dados trazido do BD.

Desenvolvendo

A solução é mais simples que podemos imaginar, você vai precisar apenas prefix o ROLE_. Para quem usa MySQL temos a funcao concat(), no Oracle podemos usar | | etc. Em verifique na documentação do seu banco como concatenar.

A seguir mostramos com o MySQL. É simples demais, confira:

authorities-by-username-query="SELECT  username, concat('ROLE_',authority) FROM users where username = ? "

O código completo fica assim:

< jdbc-user-service data-source-ref="dataSource"  

users-by-username-query="SELECT username, password, 'true' as enable FROM users WHERE username=?"
authorities-by-username-query="SELECT  username, concat('ROLE_',authority) FROM users where username = ? "
/>

ou dessa forma:

 users-by-username-query="SELECT l.login as username, l.senha as password, 'true' as enable from funcionario l where l.login=?"	
authorities-by-username-query="SELECT lo.login as username, CONCAT('ROLE_',lo.cargo)as authority FROM funcionario lo where lo.login=?"	/>
 

Outra dica é se a coluna do usuario/password não for o que o Spring Security espera, basta você fazer conforme o código a seguir:

users-by-username-query="SELECT us.email as username, us.senha as password, 'true' as enable FROM	usuario as us WHERE email=?"
authorities-by-username-query="SELECT  us.email as username, us.tipo as authority FROM usuario us where email= ?"

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

Abracos e até o próximo 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.