Problema de conexão a JNDI com Hibernate na Locaweb

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.

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é.

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

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

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();

[quote=“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
[/quote]

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.

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?

[quote=“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?[/quote]

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

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.