Pergunta

Estamos usando Spring 2.5.4 / Hibernate 3.2 / Websphere Application Server 6.1.0.17. Temos implantado o aplicativo em uma caixa AIX. No dia seguinte, quando eu entrar, eu tento fazer login no aplicativo. Eu recebo esta exceção na página:

Error 500: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query

Eu verifiquei os system.out registros e veja mais detalhes. (Pastebin usado porque a formatação log foi realmente estragar o layout da página)


A linha de nosso código que está causando o nosso exceção é:

List loginList = getHibernateTemplate().find("from Login  
    where storeId =" + id + " and password ='" + password + "'");

Estamos a fiação da conexão em applicationContext.xml da Primavera. Estamos conscientes de que a conexão no AS400 cai às vezes (eles podem reiniciar o sistema durante a noite - não tenho certeza). No entanto, temos de preferência não gostaria de abrir uma nova conexão quando estamos a fiação tudo no applicationContext.

Este problema ocorre irregardless de usar uma fonte de dados / JNDI ou JDBC

Alguém sabe de quaisquer configurações para adicionar a qualquer primavera ou Hibernate para verificar se a conexão fica obsoleto, e se assim for, soltá-lo e criar um novo? Ou quaisquer outras ideias para resolver esse problema? Deixe-me saber se você precisar de mais informações / código.

Muito apreciada,

Chris

Update:

Check-out alguns posts nos fóruns da Comunidade Primavera e eu tenho implementado o meu DataSource com commons-DBCP que tem algumas propriedades como 'testWhileIdle' e 'validationQuery'. Vou deixar o aplicativo em execução e verificá-lo novamente no AM. Vou postar uma atualização sobre os resultados.

Atualização # 2:

Usando DBCP-commons BasicDataSource parece corrigir esse problema, o que parece ser um problema de rede. Websphere tem agrupada conexões, e se há um problema de rede no lado do AS400, ele vai tentar usar a conexão que tem, o que ele não sabe é 'obsoleto'. Usando um validationQuery com um intervalo de tempo é um barato (mas eficiente) maneira de resolver este problema - mas pode haver uma maneira melhor no lado do Websphere, sob configuração. Mas, assim não pode mudar o que não está quebrado, então até isso falhar, ele provavelmente será a nossa solução vai para a frente.

Foi útil?

Solução

Ah, isso é o que eu ia dizer ... o problema deve ser resolvido no conjunto de conexão, validando conexões antes de devolvê-los. DBCP tem validationQuery e JBoss também tem algo semelhante; Tenho certeza Websphere deve ter algo semelhante no seu pool de conexão para conexões Validar antes de entregá-los para fora. Mesmo se você não usar testWhileIdle, se a conexão for considerada inválida, um novo é criado e entregue a você na piscina em vez de um inválido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top