[Hibernate] Boas Praticas. Dúvida?

3 respostas
M

Bom dia pra vcs,

Comecei a pouco tempo a estudar o framework Hibernate e estou com algumas dúvidas simples.
Qual a melhor forma de se utilizar o Hibernate?
Digo, minha aplicação constantemente da estouto de numero de conexoes e creio q esse erro seja porq estou usando o Hibernate de forma indevida.

Quais são os passos para se fazer Update, Select e Insert?
Atualmente eu uso dessa forma:

//[Select]===========================================
daoFactory = new DAOFactory();
Usuario d = daoFactory.getUsuarioDAO().procura(id);
daoFactory.close();
//[Update]==========================================
daoFactory = new DAOFactory();
daoFactory.beginTransaction();
daoFactory.getUsuarioDAO().adiciona(user);
daoFactory.commit();
daoFactory.close();
//[Insert]==========================================
daoFactory = new DAOFactory();
daoFactory.beginTransaction();
daoFactory.getUsuarioDAO().atualiza(d);
daoFactory.commit();
daoFactory.close();

Cenário:
Aplicação J2EE (Servlets/Hibernate/JPA)
Servlet fica recebendo informacoes e gravando no banco de dados.
Banco de Dados Oracle XE.

Dúvidas:

Estou usando o hibernate de forma correta?
O que normalmente causa estouro de conexoes com o banco de dados ?
Tem como monitorar o pool de conexoes do Hibernate?

public class DAOFactory {
	
	private final Session session;
	private Transaction transaction;
	
	public DAOFactory() {
		session = HibernateUtil.getSession();
	}
	
	public void beginTransaction() {
		this.transaction = this.session.beginTransaction();
	}
	
	public void commit() {
		this.transaction.commit();
		this.transaction = null;
	}
	
	public boolean hasTransaction() {
		return this.transaction != null;
	}
	
	public void rollback() {
		this.transaction.rollback();
		this.transaction = null;
	}
	
	public void close() {
		this.session.close();
	}

        public UsuarioDAO getUsuarioDAO () {
               return new UsuarioDAO(this.session);
        }
}

Meu hibernate.xml

<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
<property name="hibernate.connection.username">teste</property>
<property name="hibernate.connection.password">teste</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.show_sql">false</property>
        
<property name="hibernate.connection.provider_class">
	org.hibernate.connection.C3P0ConnectionProvider
</property>
        
<property name="c3p0.acquire_increment">1</property> 
<property name="c3p0.idle_test_period">100</property>
<property name="c3p0.max_size">100</property> 
<property name="c3p0.max_statements">0</property> 
<property name="c3p0.min_size">10</property> 
<property name="c3p0.timeout">100</property>
Obrigado.

3 Respostas

eduardoac

Para não dar estouro de conexões, você deve fechar todas ao ser executadas (lógico que depende do número de transações). Se toda sua programação estiver correta, da uma olhada no Oracle XE, já tive problemas com ele em alguns programas de carga, dai tive que aplicar um comando para ele suportar a quantidade de processos:

ALTER SYSTEM SET PROCESSES=150 SCOPE=SPFILE;

Oracle XE é mais para testes mesmo, então ele pode ser o gargalo.
Abraços.

M

Então, teoricamente a configurações do hibernate estão certas, ou seja não estou as usando de forma indevida.

Seguindo sua linha eduardoac executei o seguinte comando no banco:

Devo aumentar apenas o processes ou algum outro parametro tbm?

Obrigado.

select * from v$resource_limit;
RESOURCE_NAME                  CURRENT_UTILIZATION    MAX_UTILIZATION        INITIAL_ALLOCATION LIMIT_VALUE 
------------------------------ ---------------------- ---------------------- ------------------ ----------- 
processes                      24                     33                             40                 40  
sessions                       25                     34                             49                 49  
enqueue_locks                  13                     21                            790                790  
enqueue_resources              13                     36                            432          UNLIMITED  
ges_procs                      0                      0                               0                  0  
ges_ress                       0                      0                               0          UNLIMITED  
ges_locks                      0                      0                               0          UNLIMITED  
ges_cache_ress                 0                      0                               0          UNLIMITED  
ges_reg_msgs                   0                      0                               0          UNLIMITED  
ges_big_msgs                   0                      0                               0          UNLIMITED  
ges_rsv_msgs                   0                      0                               0                  0  
gcs_resources                  0                      0                               0                  0  
gcs_shadows                    0                      0                               0                  0  
dml_locks                      0                      51                            212          UNLIMITED  
temporary_table_locks          0                      3                       UNLIMITED          UNLIMITED  
transactions                   1                      7                              53          UNLIMITED  
branches                       0                      0                              53          UNLIMITED  
cmtcallbk                      0                      1                              53          UNLIMITED  
sort_segment_locks             0                      1                       UNLIMITED          UNLIMITED  
max_rollback_segments          11                     11                             53              65535  
max_shared_servers             4                      4                       UNLIMITED          UNLIMITED  
parallel_max_servers           0                      0                               0               3600
eduardoac

Eu alterei apenas esse parâmetro no banco de dados.
No seu caso, funcionou?

Criado 20 de setembro de 2010
Ultima resposta 20 de set. de 2010
Respostas 3
Participantes 2