Hibernate: Connection Pool excedido, help!

Pessoal tenho uma aplicação spring + hibernate + jsf, onde depois de umas 10 chamadas o tomcat me gera este erro dizendo que o pool de conexão esgotou, e o postgresql diz ter muitos usuários conectados…

uso o spring para gerenciar o hibernate, e o jndi que utilizo já alterei parâmetros mas nao adianta…
já alterei isso:

maxActive="" maxIdle=""

agora aqui: INFO: Hibernate connection pool size: 20 diz tamanho de 20, mas nao especifiquei, seria no caso o padrão :?: como altero…

mas minha dúvida é: se somente eu estou usando a aplicação, porque ele está excedendo, no caso o spring ta falhando :?:

07/04/2008 22:54:03 org.hibernate.connection.DriverManagerConnectionProvider configure INFO: Using Hibernate built-in connection pool (not for production use!) 07/04/2008 22:54:03 org.hibernate.connection.DriverManagerConnectionProvider configure INFO: Hibernate connection pool size: 20 07/04/2008 22:54:03 org.hibernate.connection.DriverManagerConnectionProvider configure INFO: autocommit mode: true 07/04/2008 22:54:03 org.hibernate.connection.DriverManagerConnectionProvider configure INFO: using driver: org.postgresql.Driver at URL: jdbc:postgresql://localhost:5432/virtualhomologacao 07/04/2008 22:54:03 org.hibernate.connection.DriverManagerConnectionProvider configure INFO: connection properties: {user=postgres, password=****, autocommit=true, release_mode=auto} 07/04/2008 22:54:03 org.hibernate.cfg.SettingsFactory buildSettings WARNING: Could not obtain connection metadata org.postgresql.util.PSQLException: FATAL: desculpe, muitos clientes conectados

vlw

Primeiro, você não está usando um pool, o hibernate está carregando o DriverManagerConnectionProvider, e segundo, esse erro acontece quando você esquece de fechar as conexões.

mas sobre as conexões, por exemplo um método de minha DAO:

 @PersistenceContext  
  private EntityManager em;  
    public void delete( Object entity ) {  
         em.remove(entity);  
         em.flush();  
     } 

por exemplo em todas eu uso sempre o em.flush(); isso não seria o suficiente… :?:

Não, você tem que dar close em todas elas, oras.

achei que o spring faria isso… achei que a parte que está configurada pro EntityManager incluia ele fechar…

quanto ao flush() pensei um e falei outro, eu ia dizer close() mesmo, porém não eu fazendo e sim o spring, pois até então eu achei que ele estaria realizando isso…
mesmo eu não colocando explicitamente, minha concepção é de que o spring fazia o em.close(), pois ele que está gerenciando a Manager…

[quote=Javabuntu]quanto ao flush() pensei um e falei outro, eu ia dizer close() mesmo, porém não eu fazendo e sim o spring, pois até então eu achei que ele estaria realizando isso…
mesmo eu não colocando explicitamente, minha concepção é de que o spring fazia o em.close(), pois ele que está gerenciando a Manager…[/quote]

Ele tá gerenciando o que? Você definiu o controle de transações? Configurou aonde? Tem o filtro de requisições configurado?

está configurado isso no applicationContext:

[code]


<!-- Transaction manager para um JPA EntityManagerFactory -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!-- Instrui o Spring a realizar gerenciamento transacional declarativo automático nas classes anotadas.-->

<tx:annotation-driven transaction-manager=“transactionManager”/>[/code]

e estes dois listener pra poder tratar minhas requisições no jsf…

<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>
e este correspondente no faces-config:

<application> <variable-resolver> org.springframework.web.jsf.DelegatingVariableResolver </variable-resolver> </application>

Até onde eu sei, isso não é o suficiente, você tem que configurar o OpenEntitymanagerInViewFilter (assim como agente configurada o do Hibernate) -> http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.html

desculpe a ignorância, mas vc quer dizer “fechar as conexões” utilizando o EntityManager (em) certo? até onde sei, na verdade, não estamos realmente fechando as conexões, mas sim informando ao EntityManager que não precisamos mais delas (se fechássemos realmente as conexões não haveria o porquê do pool).

Me corrijam se estiver errado.

Woody

desculpe a ignorância, mas vc quer dizer “fechar as conexões” utilizando o EntityManager (em) certo? até onde sei, na verdade, não estamos realmente fechando as conexões, mas sim informando ao EntityManager que não precisamos mais delas (se fechássemos realmente as conexões não haveria o porquê do pool).

Me corrijam se estiver errado.

Woody[/quote]

Voce esta certo! Apartir do momento que usamos um pool de conexão, ou seja quem ira gerenciar nossas conexoes, não precisamos mais nos "preocupar com fechar uma conexão que nao esta sendo utilizadas. Verdadeiros pools de conexoes, c3p0 por exemplo, possui um parametro,

<property name="hibernate.c3p0.idle_test_period">50</property>
que verifica de tempos em tempos na quela thread quais conexoes realmente esta e nao sendo usadas e as mata se necessario.
Isso pensando por um lado pode ser muito bom, mas por outro devemos pensar bem ao usa-lo.

[ ]s,