Spring + Hibernate: abrindo conexões demais

9 respostas
rodpuc

Estou tomando o seguinte erro:

org.postgresql.util.PSQLException: FATAL: connection limit exceeded for non-superusers

Minha aplicação usa spring e hibernate e meu usuário do banco não pode ser um superuser (limitação do servidor, que é compartilhado).
Isso aconteceu enquanto eu testava o sistema e havia outras 2 pessoas testando ele junto.

Alguma idéia do que pode estar causando isso e como solucionar?

9 Respostas

S

tens que dar permissão no usuario para poder abrir mais conexões na base de dados em simultaneo, se fosse no mysql ou oracle eu podia ser mais especifico …

rodpuc

Mas essa não é uma solução muito legal… senão o dia em que eu tiver 1 milhão de usuários vou ter q permitir que sejam criadas 1 milhão de conexões :shock:

Eu tenho palpites:
1 - O spring não deve estar fechando as conexões como deveria.
2 - Se a aplicação tenta abrir uma conexão e não consegue, ela deveria esperar um tempo e tentar de novo até conseguir.

Pode estar acontecendo 1 dos problemas ou até mesmo os 2 simultâneamente.

Eu usei spring esperando n ter dor de cabeça com essas coisas e me ferrei pelo visto.

S

tens razao talvez esta nao seja a solucao ideal, mas existe dois tipos de solucoes possiveis como programador e como DBA, eu dei a como DBA

rodpuc

up!

Estou precisando muito de ajuda, esse problema é a única coisa que me impede de colocar o sistema em produção :cry:
Já tentei de tudo e nada funciona, já to ficando desesperado hahaha

fernandaleite

rodpuc, estou passando pelo mesmo problema, por algum acaso vc teve alguma luz de como resolver??

rodpuc

Mais ou menos.

Além de configurar o BD no persistence.xml, eu também criei um dataSource no applicationContext.xml com as mesmas configurações. Eu não sei porque, mas funcionou. Se eu tiro as configs de um dos arquivos o problema volta.

A má notícia é que eu queria configurar o c3p0 para gerenciar um pool de conexões e não consegui fazer isso do jeito que as coisas estão, mas pelo menos ele parou de largar conexões abertas.

Acho que vc pode tentar fazer o mesmo, mas o ideal seria que alguém aí ajudasse a gente a encontrar uma solução realmente definitiva.

fernandaleite

Beleza, vou tentar isso na segunda feira e dou um retorno… até lá se alguém puder, como ele disse, nos ajudar a encontrar uma solução mais definida, por favor, nos ajude…

fernandaleite

ih, não achei esse persistence.xml
aqui eu uso no context.xml

o DataSource como:

<bean id="atacadoDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" >
	<property name="jndiName" value="java:comp/env/jdbc/MichelinDistribuicaoDS" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory" ref="atacadoSessionFactory" />
</bean> 	
...
<property name="hibernateProperties">
	<props>
		<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
		<prop key="hibernate.show_sql">true</prop>
		<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
		<prop key="hibernate.cache.use_query_cache">true</prop>
		<prop key="hibernate.use_second_level_cache">true</prop>
		<prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
				
		<prop key="hibernate.transaction.flush_before_completion">true</prop>
		<prop key="hibernate.transaction.auto_close_session">true</prop>
		<prop key="hibernate.connection.release_mode">after_transaction</prop>
	</props>
</property>

e dentro do postegres-ds.xml como:

<jndi-name>jdbc/ExemploDS</jndi-name>
<connection-url>jdbc:postgresql://exemplolocalhost:5432/banco</connection-url>
<driver-class>javax.sql.DataSource</driver-class>
<user-name>usuario</user-name>
<password>senha</password>
<min-pool-size>0</min-pool-size>
<max-pool-size>100</max-pool-size>
<idle-timeout-minutes>0</idle-timeout-minutes>

Porém qnd carrego um link em específico ele sempre mostra
Caused by: org.postgresql.util.PSQLException: FATAL: connection limit exceeded for non-superusers

Mas ainda consigo fazer a consulta, se for pra outro lugar e depois tentar consultar novamente, ele acusa:
“Cannot get a connection, pool error Timeout waiting for idle object”
“Timeout waiting for idle object”

fernandaleite

rodpuc, vc conhece essa forma q eu fiz??
alguém tem alguma sugestão de como posso resolver meu problema??

Criado 21 de fevereiro de 2011
Ultima resposta 14 de mar. de 2011
Respostas 9
Participantes 3