Pool de conexões no Tomcat

0 respostas
P

Amigos estou tentando rodar o exemplo da Java Magazine 33 sobre Hibernate na web. Acredito que consegui montar tudo correto. Mas na hora que o Tomcat Inicia ele acessa a aplicação mas sai em uma excessão que diz: Não foi possível listar as Reservas do dia ....(dia de hoje no caso).

Depurei e vi que a mesagem volta da Classe ReservaDAO.

Esse trecho:
Session ses = TransacaoAplicacao.getSessao();

volta null.

O exemplo usa o pool de conexões do tomcat. Acho que não estou sabendo configurar corretamente o pool de conexões para acessar o hsqldb.

Alguém pode me ajudar? Preciso de uma orientação sobre como configurar adequadamente hibernate + pool de conexão do Tomcat + hsqldb.

Segue meus arquivos:

ReservaDAO.java:

Código:
package persistencia; 

import java.text.DateFormat; 
import java.util.*; 
import org.hibernate.*; 
import org.hibernate.exception.*; 

public class ReservaDAO { 

//TODO: este DAO sempre inicia e finaliza suas próprias transações, portanto não pode ser usada como parte de uma transação maior 
//TODO: deveria haver um objeto de negócios (ou fachada) para fazer este controle 

public ReservaDAO() { 
} 

public Sala leSala(int id) { 
try { 
Session ses = TransacaoAplicacao.getSessao(); 
Sala sala = (Sala) ses.get(Sala.class, new Integer(id)); 
TransacaoAplicacao.confirma(); 
return sala; 
} 
catch (Exception e) { 
TransacaoAplicacao.aborta(); 
throw new PersistenciaException("£o foi possível recuperar a Sala " + id, e); 
} 
} 

public List listaSalas() { 
try { 
Session ses = TransacaoAplicacao.getSessao(); 
Query query = ses.createQuery("from Sala s order by s.nome"); 
List resultado = query.list(); 
TransacaoAplicacao.confirma(); 
return resultado; 
} 
catch (Exception e) { 
TransacaoAplicacao.aborta(); 
throw new PersistenciaException("£o foi possível listar as Salas", e); 
} 
} 

public void salvaReserva(Reserva r) { 
try { 
Session ses = TransacaoAplicacao.getSessao(); 
ses.saveOrUpdate(r); 
//TODO: Tirar todos os confirmas e deixar que alguém (o controlador?) faça isto??? 
TransacaoAplicacao.confirma(); 
} 
catch (ConstraintViolationException e) { 
TransacaoAplicacao.aborta(); 
DateFormat df = DateFormat.getInstance(); 
throw new InsercaoDuplicadaException("Outro usuário ¡ fez uma reserva para a sala " + 
r.getSala().getNome() + " no dia " + df.format(r.getInicio()), e); 
} 
catch (StaleObjectStateException e) { 
TransacaoAplicacao.aborta(); 
throw new LockOtimistaException("A Reserva " + r.getId() + " ¡ foi alterada por outro usuário", e); 
} 
catch (Exception e) { 
TransacaoAplicacao.aborta(); 
throw new PersistenciaException("£o foi possível salvar a Reserva: " + r.getId(), e); 
} 
} 

public void cancelaReserva(Reserva r) { 
try { 
Session ses = TransacaoAplicacao.getSessao(); 
ses.delete(r); 
TransacaoAplicacao.confirma(); 
} 
catch (StaleObjectStateException e) { 
TransacaoAplicacao.aborta(); 
throw new LockOtimistaException("A Reserva " + r.getId() + " ¡ foi alterada por outro usuário", e); 
} 
catch (Exception e) { 
TransacaoAplicacao.aborta(); 
throw new PersistenciaException("£o foi possível salvar a Reserva: " + r.getId(), e); 
} 
} 

public Reserva leReserva(int id) { 
try { 
Session ses = TransacaoAplicacao.getSessao(); 
Query query = ses.createQuery( 
"from Reserva r join fetch r.sala s " + 
"where r.id = :id "); 
query.setParameter("id", new Integer(id)); 
List resultado = query.list(); 
TransacaoAplicacao.confirma(); 
if (resultado.size() == 1) 
return (Reserva)resultado.get(0); 
else 
return null; 
} 
catch (Exception e) { 
TransacaoAplicacao.aborta(); 
throw new PersistenciaException("£o foi possível recuperar a Reserva " + id, e); 
} 
} 

public List listaReservasSala(int sala, Calendar inicio, Calendar fim) { 
return listaReservasSala(sala, inicio.getTime(), fim.getTime()); 
} 

public List listaReservasSala(int sala, Date inicio, Date fim) { 
try { 
Session ses = TransacaoAplicacao.getSessao(); 
Query query = ses.createQuery( 
"from Reserva r join fetch r.sala s " + 
"where s.id = :sala " + 
"and r.inicio >= :inicio and r.inicio <= :fim " + 
"order by hour(r.inicio), dayofweek(r.inicio)"); 
query.setParameter("sala", new Integer(sala)); 
query.setParameter("inicio", inicio); 
query.setParameter("fim", fim); 
List resultado = query.list(); 
TransacaoAplicacao.confirma(); 
return resultado; 
} 
catch (Exception e) { 
TransacaoAplicacao.aborta(); 
throw new PersistenciaException("£o foi possível listar as Reservas para a sala " 
+ sala + " no período indicado", e); 
} 
} 

public List listaReservasDia(Date data) { 
Calendar cal = Calendar.getInstance(); 
cal.setTime(data); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
data = cal.getTime(); 
cal.add(Calendar.DAY_OF_MONTH, 1); 
try { 
Session ses = TransacaoAplicacao.getSessao(); 
Query query = ses.createQuery( 
"from Reserva r join fetch r.sala s " + 
"where r.inicio >= :inicio and r.inicio <= :fim " + 
"order by hour(r.inicio), s.nome "); 
query.setParameter("inicio", data); 
query.setParameter("fim", cal.getTime()); 
List resultado = query.list(); 
TransacaoAplicacao.confirma(); 
return resultado; 
} 
catch (Exception e) { 
TransacaoAplicacao.aborta(); 
throw new PersistenciaException("£o foi possível listar as Reservas do dia " 
+ data, e); 
} 
} 
}

context.xml:

Código:
<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/reservaSalas"> 

<!-- para o Tomcat 5.5 --> 
<Resource name="jdbc/Reservas" auth="Container" type="javax.sql.DataSource" 
maxActive="1" maxIdle="0" maxWait="-1" 
username="sa" password="" driverClassName="org.hsqldb.jdbcDriver" 
url="jdbc:hsqldb:file:C:\bd\Reservas;shutdown=true"/> 

<!-- para o Tomcat 5.0 --> 
<!-- 
<Resource name="jdbc/Reservas" 
auth="Container" 
type="javax.sql.DataSource" /> 
--> 

<!-- 
<ResourceParams name="jdbc/Reservas"> 
--> 

<!-- Se permitir mais conexões, vou precisar de um meio de fazer 
o shutdown do HSQLDB. 
Poderia usar o ContextListenerr --> 
<!-- 
<parameter> 
<name>maxActive</name> 
<value>1</value> 
</parameter> 
<parameter> 
<name>maxIdle</name> 
<value>0</value> 
</parameter> 
<parameter> 
<name>maxWait</name> 
<value>-1</value> 
</parameter> 

<parameter> 
<name>username</name> 
<value>sa</value> 
</parameter> 
<parameter> 
<name>password</name> 
<value></value> 
</parameter> 
<parameter> 
<name>driverClassName</name> 
<value>org.hsqldb.jdbcDriver</value> 
</parameter> 
<parameter> 
<name>url</name> 
<value>jdbc:hsqldb:file:/home/lozano/jm/reservas;shutdown=true</value> 
</parameter> 
--> 

<!-- 
</ResourceParams> 
--> 

</Context>

hibernate.cfg.xml

Código:
<?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> 

<!-- Parâmetros de conexão ao banco de dados --> 
<property name="connection.datasource">java:/comp/env/jdbc/Reservas</property> 

<property name="connection.driver_class">org.hsqldb.jdbcDriver</property> 
<property name="connection.url">jdbc:hsqldb:file:C:\bd\Reservas;shutdown=true</property> 
<property name="connection.username">sa</property> 
<property name="connection.password"></property> 

<!-- Dialeto SQL do banco --> 
<property name="dialect">org.hibernate.dialect.HSQLDialect</property> 

<!-- Exibe comandos SQL na saída padrão --> 
<property name="show_sql">false</property> 

<!-- Arquivos de mapeamento OO/Relacional --> 
<mapping resource="persistencia/Sala.hbm.xml"/> 
<mapping resource="persistencia/Reserva.hbm.xml"/> 

</session-factory> 

</hibernate-configuration>

[size="11"][color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - marcossousa[/color][/size] :joia:

Criado 1 de junho de 2006
Respostas 0
Participantes 1