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