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
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.
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?
<!-- 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.-->
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:
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).
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.