Problema com Tomcat!

4 respostas
ThiagoWorldCoder

Boa tarde galera!!

Eu fiz o .war da minha web aplicação e fiz o deploy no Tomcat 6. Eu uso o hibernate e passo a configuração de banco pelo hibernate.cfg.xml.
Ao acessar o banco de dados pela web aplicação, e realizar uma consulta, consigo buscar os dados normalmente, entretanto parece que o tomcat mantém a conexão com o banco e não está encerrando ela.
Eu abro e fecho a sessão no meu projeto sempre quando termina uma consulta, como faço para fechar essa ligação sem precisar fazer o stop no tomcat?!!!

valeu!!

4 Respostas

P

Como você ta acessando o banco?

Ta usando algum tipo de pool de conexões?

ThiagoWorldCoder

aqui está o meu hibernate.cfg.xml:
a minha url senha e usuario estão no hibernate.properties

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>

		<property name="hibernate.connection.driver_class"> meuDriver</property>

		<property name="current_session_context_class">thread</property>
		<property name="hibernate.dialect"> MeuDialeto</property>
		<!-- Disable second-level cache. -->
		<property name="hibernate.cache.provider_class"> org.hibernate.cache.NoCacheProvider </property>
		<property name="hibernate.cache.use_second_level_cache">false</property>
		<!-- Print SQL to stdout. -->
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>

		<!-- XML mapping -->

		<mapping
			resource="pacote.pacote.mapeamento.hbm.xml" />
		
	</session-factory>
</hibernate-configuration>
iDexter
paulohrl:
Como você ta acessando o banco?

Ta usando algum tipo de pool de conexões?

Boa tarde!

Olá estou com um problema semelhante, pois ao efetuar algumas operacões de inserção e leitura minha aplicação web está dando estouro de "java heap size", como o colega acima também estou fechando todas as sessions, utilizo um abstract DAO no sistema. Como cada chamada a um servlet é uma nova thread, sei que um novo sessionFactory está sendo criada para cada chamada a um servlet, suspeito que este seja o problema, mas como posso evitar isso, e garantir que a SessionFactory seja compartilhada, se possível, ou sejam removidas quando o servlet for destuido pelo container, pensei em uma objeto sessionFactory no ServletContext mais eu teria que passá-lo como parametro por muitas camadas do sistema.
Facade -> Controler -> Cadastro -> DAO.

As configurações de POOL, a única coisa sobre, está aí na configuração. No sever.xml a única coisa que alterei foi o REALM e o SSL.
Observação: Quando não dá java heap size dá um erro de acesso as configurações e nesse caso o sistema continua no ar conectado ao banco de dados por JDBC padrão, mas o hibernat não está mais acessível.

:shock: que situação hein?. Desde já agradeço por qualquer informação.

Estas são as configurações do Hibernat:

<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLDialect
		</property>

		<!-- JDBC connection pool (use the built-in) -->
		<property name="connection.pool_size">5</property>

		<!-- Enable Hibernate's automatic session context management -->
		<property name="current_session_context_class">thread</property>

		<!-- Disable the second-level cache  -->
		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

		<!-- Condiguracao do c3p0 
		<property name="hibernate.c3p0.max_size">10</property>
		<property name="hibernate.c3p0.min_size">2</property>
		<property name="hibernate.c3p0.timeout">5000</property>
		<property name="hibernate.c3p0.max_statements">10</property>
		<property name="hibernate.c3p0.idle_test_period">3000</property>
		<property name="hibernate.c3p0.acquire_increment">2</property>
		-->
		<!-- Configuracoes de debug 
		<property name="show_sql">true</property>
		<property name="hibernate.generate_statistics">true</property>
		<property name="hibernate.use_sql_comments">true</property>
		-->
                              <property name="show_sql">false</property>

E este é meu DAO:

package dao;



import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import src.SingletonSessionFactory;


public abstract class AbstractDAO implements DAO {

	protected SessionFactory sessionFactory;
	
	/**
	 * O construtor da Classe.
	 */
	public AbstractDAO() {
		sessionFactory = new Configuration().configure().buildSessionFactory();
	}

	/**
	 * O construtor da Classe.
	 * @param sessionFactory um factory para sessoes
	 */
	public AbstractDAO(SessionFactory sessionFactory){
		this.sessionFactory = sessionFactory;
	}

	/**
	 * Metodo que salva no Banco de Dados um objeto em uma determinda tabela.
	 * @param obj O objeto a ser salvo no Banco de Dados.
	 * @return O id do objeto criado no Banco de Dados.
	 */
	public Serializable insert(Object obj) {
		Session session = openSession();

		Transaction tx = null;
		Serializable identifier  = null;
		try {
			tx = session.beginTransaction();
			identifier = session.save(obj);
			tx.commit();
		} catch (Exception e) {
			if (tx != null)
				tx.rollback();
			//throw e; TODO relancar excessao
		} finally {
			session.flush();
			session.close();
		}
		return identifier;
	}
	/**
	 * Metodo que modifica no Banco de Dados um objeto de uma determinda tabela.
	 * @param obj O objeto a ser modificado no Banco de Dados
	 */
	public void update(Object obj){
		Session session = openSession();

		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.update(obj);
			tx.commit();
		} catch (Exception e) {
			if (tx != null)
				tx.rollback();
			//throw e; TODO relancar excessao
		} finally {
			session.flush();
			session.close();
		}
	}
	

	/**
	 * Metodo que remove no Banco de Dados um objeto de uma determinda tabela.
	 * @param obj O objeto a ser removido no Banco de Dados.
	 */
	public void delete(Object obj) {
		Session session = openSession();

		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.delete(obj);
			tx.commit();
		} catch (Exception e) {
			if (tx != null)
				tx.rollback();
			//throw e; TODO relancar a excessao
		} finally {
			session.flush();
			session.close();
		}
	}

	/**
	 * Metodo que le um objeto do Banco de Dados a partir de um id.
	 * @param id O id do objeto.
	 * @param classe A classe que o objeto pertence.
	 * @return O objeto lido do Banco de Dados.
	 */
	protected Object read(Class classe, Integer id) {
		Session session = openSession();
		Object obj = session.get(classe, id);
		session.flush();
		session.close();
		return obj;
	}

	/**
	 * Retorna uma lista de objetos do Banco de Dados com as caracter�sticas
	 * definidas por queryString.
	 * @param queryString A string da busca.
	 * @return Uma lista de objetos com as caracteristicas definidas por queryString.
	 */
	public List getList(String queryString) {
		Session session = openSession();
		Query query = session.createQuery(queryString);
		List list = query.list();
		session.flush();
		session.close();
		return list;
	}

	/**
	 * Remove todos os objetos de um determinado tipo contidos no Banco de Dados.
	 */
	protected void removeAll(String deleteFrom){
		Session session = openSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();

			Query queryDelete = session.createQuery("delete from " + deleteFrom);
			queryDelete.executeUpdate();
			
			tx.commit();
		} catch (Exception e) {
			if (tx != null)
				tx.rollback();
			//throw e; TODO relancar a excessao
		} finally {
			session.flush();
			session.close();
		}
	}
	
	/**
	 * Estabelece uma conexao e abre uma sessao com o Banco de Dados retornando-a. 
	 * @return A sessao.
	 */
	public Session openSession(){
		return sessionFactory.openSession();	
	}
}
iDexter

Para garantir que a conexão com o MySQL seja liberada, “cleaning up pool” utilizei a seguinte sequencia:

session.flush(); 
            session.disconnect();  
            session.close();
            sessionFactory.close();

nota: o driver que eu utilizo é o com.jdbc.mysql.Driver.

até mais!

Criado 7 de agosto de 2008
Ultima resposta 8 de ago. de 2008
Respostas 4
Participantes 3