Pool de conexão no Tomcat

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:

[code]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("Nã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("Nã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 já 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() + " já foi alterada por outro usuário", e);
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Nã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() + " já foi alterada por outro usuário", e);
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Nã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("Nã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("Nã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("Não foi possível listar as Reservas do dia "

  • data, e);
    }
    }
    } [/code]

context.xml:

[code]<?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>
[/code]

hibernate.cfg.xml

[code]<?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>[/code]