Problema de conexão a JNDI com Hibernate na Locaweb

7 respostas
D

Boa tarde, estou inciando em desenvolvimento java profissional, e este é o meu primeiro tópico neste fórum. Pena que seja em uma situação de desespero =)

Eu desenvolvi uma aplicação, relativamente, simples baseado nas apostilas do curso fj-21 e fj-28 da Caelum, utilizando VRaptor e Hibernate (com Hibernate Annotations).

A aplicação funciona sem nenhum problema na minha base (Tomcat 6.0.13, conexao jdbc diretamente), mas na hospedagem - Locaweb (Tomcat 5.5) com JVM dedicada - não funciona.

Na Locaweb, utilizando jdbc diretamente, a aplicação é bastaaaaante instável. Entretanto, desde quarta-feira, configuraram o JNDI para que eu possa utilizar, mas nada funciona com ele.

Segue o meu hibernate.properties:

hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.connection.datasource java:comp/env/jdbc/clientesocyal 
hibernate.show_sql = false

Segue o meu HibernateConf:

package br.com.segurotorcedor.conf;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.segurotorcedor.modelo.BrindeSorteio;
import br.com.segurotorcedor.modelo.Cliente;
import br.com.segurotorcedor.modelo.Clube;
import br.com.segurotorcedor.modelo.Link;
import br.com.segurotorcedor.modelo.Noticia;
import br.com.segurotorcedor.modelo.ParametrosGerais;
import br.com.segurotorcedor.modelo.PromocaoSorteio;

public class HibernateConf {

	private static SessionFactory factory;
	
	static {
		AnnotationConfiguration cfg = new AnnotationConfiguration();

		cfg.addAnnotatedClass(BrindeSorteio.class);
		cfg.addAnnotatedClass(Cliente.class);
		cfg.addAnnotatedClass(Clube.class);
		cfg.addAnnotatedClass(Link.class);
		cfg.addAnnotatedClass(Noticia.class);
		cfg.addAnnotatedClass(PromocaoSorteio.class);
		cfg.addAnnotatedClass(ParametrosGerais.class);
		
		factory = cfg.buildSessionFactory();
		
		System.out.println("rodou hibernateConf");
	}

	public static Session getSession() {
		return factory.openSession();
	}
}

Eu criei um pequeno jsp de teste, que pega a sessao diretamente do HibernateConf. Segue:

<%@page import="br.com.segurotorcedor.modelo.ParametrosGerais"%>
<%@page import="br.com.segurotorcedor.dao.ParametrosGeraisDAO"%>
<%@page import="org.hibernate.Transaction"%>
<%@page import="br.com.segurotorcedor.conf.HibernateConf"%>
<%@page import="org.hibernate.Session"%>
<%
		//Class.forName("br.com.segurotorcedor.conf.HibernateConf");

		Session session2 = HibernateConf.getSession();

		Transaction transaction = session2.beginTransaction();
		
		ParametrosGeraisDAO dao = new ParametrosGeraisDAO(session2);
		long l = 1;
		ParametrosGerais p =  dao.carregar(l);
		
		response.getWriter().write(p.getStrAdminLogin());
		
		transaction.commit();

O erro sempre acontece na linha onde é chamado o HibernateConf.getSession(). Tanto neste jsp de teste, qnt no DAOFactory qnd tento acessar a minha aplicação.

Chamando este jsp, o seguinte erro é apresentado (desculpa se tem coisa desnecessária, mas não estou conseguindo filtar mto bem esse log):

Já abri diversos chamados no suporte dessa empresa, mas eles insistem em afirmar que o erro é na minha aplicação, pois como criam um jsp para o teste do jndi (sem hibernate, claro) funciona, tanto no contexto add, qnt no principal.

Segue o testeJNDI.jsp:

<%@page language="java" import="java.io.*,java.sql.*,javax.sql.*,javax.naming.*" %>
<html>
<head>
<title>JNDI</title>
</head>
<body>
<%
                Connection conexao;
                ResultSet rs;
                DataSource ds;

        try {
                Context context = new InitialContext();
                Context lautx = (Context) context.lookup("java:comp/env");
                ds = (DataSource)lautx.lookup("jdbc/clientesocyal");

                conexao = ds.getConnection();
                out.write("Conectado via JNDI!<br><br>");
                Statement stmt= conexao.createStatement();

                conexao.close();

     } catch (SQLException sqle) {

     out.write("<======= OCORREU UMA EXCEPTION - VERIFICAR =======><br><br><br>" + sqle);
      sqle.printStackTrace();

        } finally {

   }
%>
</body>
</html>

Alguém já passou por problema parecido e pode me ajudar? Precisam de mais informações sobre minha aplicação? Já estou desesperado, pois não sei mais o que fazer para resolver esse problema.

Obrigado.

7 Respostas

J

Daniel, eu me lembro numa experiência com a Locaweb que eles tem algumas restrições no Tomcat e a minha aplicação também não funcionava, daí o HelpDesk me passou uma versão do Hibernate alterada pra funcionar no ambiente deles e resolveu… Só resta saber se eles já tem uma versão do Hibernate 3 assim né.

D

Paulo, obrigado.

No caso de utilizacao do JNDI, ao invés de conexão direta jdbc, eu tenho que alterar a minha aplicação somente no hibernate.properties? Não teria outros pontos de alteração necessárias, tipo na criação de sessao?

Abraço

L

Já utilizei os serviços da locaweb, que por sinal são muito bons, segundo o log de erros, o problema está no nome de referência para o banco, no caso clientesocyal

Primeiro você deveria verificar se nas configurações do tomcat eles criaram a conexão com esse nome clientesocyal, e outra coisa, não sei se reparou, mas se a configuração do seu hibernate.properties estiver do mesmo jeito que passou o código aqui:

hibernate.connection.datasource java:comp/env/jdbc/clientesocyal

está faltando o =
no caso ficaria

hibernate.connection.datasource = java:comp/env/jdbc/clientesocyal

Faça os testes

D

Paulo, obrigado pela ajuda. Em relação as limitações do tomcat, no meu caso não existem, pois utilizo JVM privativa (eles nao vendem mais compartilhada). Sobre a me disponibilizarem a lib do hibernate alterada por eles, foi feito, mas por ser uma versão anterior, a app começou a apresentar outras exceções e por isso voltei ao jar que estava utilizando.

Já tentei substituir a lib na minha base, recompilando o meu projeto, mas não consegui fazer funcionar, nem mesmo na minha base.

Como faço para passar a utilizar essa outra versão da lib, sem que o meu projeto faça referência a essa classe (org/hibernate/engine/query/sql/NativeSQLQueryReturn)?

Na verdade, o erro acontece nessa linha de codigo do meu arquivo HibernateConf - factory = cfg.buildSessionFactory();

“lucianobianchi”:
Já utilizei os serviços da locaweb, que por sinal são muito bons, segundo o log de erros, o problema está no nome de referência para o banco, no caso clientesocyal

Primeiro você deveria verificar se nas configurações do tomcat eles criaram a conexão com esse nome clientesocyal, e outra coisa, não sei se reparou, mas se a configuração do seu hibernate.properties estiver do mesmo jeito que passou o código aqui:

Código:

hibernate.connection.datasource java:comp/env/jdbc/clientesocyal

está faltando o =
no caso ficaria

Código:

hibernate.connection.datasource = java:comp/env/jdbc/clientesocyal

Faça os testes

Luciano, obrigado também. Realmente, o hibernate.properties estava errado, sem o sinal de igualdade. Entretanto, não sei como, acho que ele estava aceitando a configuração do mesmo jeito, visto que o problema persiste da mesma forma. =/

Sobre a configuração do tomcat deles, eles afirmam que está correta, pois disponibilizam um arq jsp de teste de conexao com JNDI que estah funcionando. =/

Mas o problema é que a conexao deste arq com o JNDI é direta, sem uso do hibernate (claro).

Segue algumas informações geradas no log do tomcat, junto com a exceção que está acontecendo:

Será que não é nenhum problema de incompatibilidades de versões? Do hibernate, tomcat, hibernate-annotions?

Realmente não sei como resolver =/

Estou utilizando:

  • Hibernate-Version: 3.2.4.sp1
  • Hibernate Annotations - Version: 3.3.0.GA
  • Hibernate Commons Annotations - Version: 3.0.0.GA
  • EJB Implementation-Version: 3.0 Final Release March 14 2007
  • VRaptor - version=2.3.3

e mais algumas outras libs.

P

cara…nunca utilizei os serviçoes da locaweb com Hibernate3, mas na versão 2, tínhamos realemnte q usar o jar deles, por algumas limitações de segurança imposta por eles, inclusive quem fez a implementação do jar usada por eles foi o pessoal da Caelum (Paulo e Guilherme Silveira)…

agora na versão 3 eu não tenho certeza, confirma com o pessoal da Locaweb, pq se tiver q usar o jar deles mesmo, não adianta vc ficar batendo cabeça nesse erro…

alias, em q momento aquela exceção de NativeSQL eh disparada? em qualquer acesso ao banco?

D

“pedrobusko”:
cara…nunca utilizei os serviçoes da locaweb com Hibernate3, mas na versão 2, tínhamos realemnte q usar o jar deles, por algumas limitações de segurança imposta por eles, inclusive quem fez a implementação do jar usada por eles foi o pessoal da Caelum (Paulo e Guilherme Silveira)…

agora na versão 3 eu não tenho certeza, confirma com o pessoal da Locaweb, pq se tiver q usar o jar deles mesmo, não adianta vc ficar batendo cabeça nesse erro…

alias, em q momento aquela exceção de NativeSQL eh disparada? em qualquer acesso ao banco?

Pedro, como faço para alterar o jar do hibernate no meu projeto? A exceção que postei acima - java.lang.NoClassDefFoundError: org/hibernate/engine/query/sql/NativeSQLQueryReturn - acontece no meu arquivo br.com.segurotorcedor.conf.HibernateConf, na linha onde tento pegar a sessao: factory = cfg.buildSessionFactory();

A versão do Hibernate que estou utilizando é a 3.2.4.sp1, e a versão que a Locaweb disponibiliza é a 3.1.3 modificada.

Obrigado

D

Galera, valeu pela ajuda. O problema se resolveu sem nenhuma medida tomada.

Talvez tenha sido algum problema de configuração lá na Locaweb, apesar deles alegarem que não alteraram nada.

Obrigado a todos que colaboraram.

Criado 14 de julho de 2007
Ultima resposta 26 de jul. de 2007
Respostas 7
Participantes 4