Transferindo configuração do hibernate.cfg.xml para data source [Resolvido]

3 respostas
M

Pessoal, boa tarde

gostaria de ajuda para passar as configurações do hibernate.cfg.xml para um data source no tomcat 7.

Fiz os seguintes passos:

1 - Configurei o arquivo server.xml do tomcat:

<Context path="/myApp" docBase="myApp"  debug="1" reloadable="true" crossContext="true">  
	        <Resource name="jdbc/myDB" auth="Container"   
	              type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"  
	              url="jdbc:mysql://localhost:3306/mydb"  
	              username="root" password="root" maxActive="20" maxIdle="10"  
	              maxWait="-1"/>   
    	</Context>

2 - Configurei o web.xml da app:

<resource-ref>
      	<description>DB Connection</description>
      	<res-ref-name>jdbc/myDB</res-ref-name>
      	<res-type>javax.sql.DataSource</res-type>
      	<res-auth>Container</res-auth>
 </resource-ref>

3 - Alterei o arquivo hibernate.cfg.xml:

<hibernate-configuration>
	<session-factory>
		
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="connection.datasource">java:comp/env/jdbc/myDB</property>
		<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
		<property name="current_session_context_class">thread</property>
		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
		<property name="show_sql">true</property>
		<property name="hbm2ddl.auto">none</property>	
                ...

Porém está dando erro ao executar o Filter que controla a conexão do hibernate com a base, sem este filter a cada requisição feita era aberta uma conexão com a base e a mesma não era fechada.

org.hibernate.exception.GenericJDBCException: Cannot open connection
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
	at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
	at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119)
	at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
	at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
	at br.com.crpesquisaclinica.action.common.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:24)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
	at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
	at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
	at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
	at org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:69)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
	... 21 more
Caused by: java.lang.NullPointerException
	at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:524)
	at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:493)
	at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:307)
	at java.sql.DriverManager.getDriver(DriverManager.java:273)
	at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
	... 25 more

Erro ao executar a linha em HibernateSessionRequestFilter:

tx = HibernateUtil.currentSession().beginTransaction();

Segue código completo

HibernateSessionRequestFilter:

public class HibernateSessionRequestFilter implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {

		Transaction tx = null;
		try {
			tx = HibernateUtil.currentSession().beginTransaction();

			// Continua a executar a ação
			chain.doFilter(request, response);

			if (tx != null) {
				tx.commit();
			}
		} catch (HibernateException e) {
			try {
				tx.rollback();
			} catch (HibernateException e1) {
				throw new HibernateException("Erro de Persistencia na base de dados: " + e.getMessage());
			}
			throw new HibernateException("Erro de Persistencia na base de dados: " + e.getMessage());
		}
		HibernateUtil.closeSession();
	}

	public void init(FilterConfig arg0) throws ServletException {
	}

	public void destroy() {
	}

}

HibernateUtil:

public class HibernateUtil {

	private static final SessionFactory sessionFactory;

	public static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

	static {
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
	public static Session currentSession() {   
		Session session = (Session) threadLocal.get();   
		// Open a new Session, if this Thread has none yet   
		if (session == null) {
			try {
				session = sessionFactory.openSession();
			} catch (HibernateException e) {
				System.err.println("Failed trying to open hibernate session." + e.getMessage());
			}   
			threadLocal.set(session);
		}
		return session;   
	}
	
	public static void closeSession() {   
		Session s = (Session) threadLocal.get();   
		if (s != null)  
			try {
				s.close();
			} catch (HibernateException e) {
				System.err.println("Failed trying to close hibernate session." + e);
			}
		threadLocal.set(null);   
	}

	
}

Alguém sabe me ajudar como resolver isso?

Obrigado.

3 Respostas

jyoshiriro

Olá.

Amigo, tente excluir a parte que fez no web.xml. Não precisei mexer no web.xml pra acessar o datasource configurado no tomcat.

jyoshiriro

A e a tag no meu código está no context.xml e não no server.xml (não sei se isso faz diferença)

M

Funcionou!!!

E para funcionar com o tomcat startado dentro do eclipse foi necessário fazer a mesma configuração dentro do projeto Servers em Project Explorer do Eclipse.

Obrigadão!!!

Criado 24 de setembro de 2012
Ultima resposta 24 de set. de 2012
Respostas 3
Participantes 2