Pregunta

Estamos utilizando Spring 2.5.4 / Hibernate 3.2 / Websphere Application Server 6.1.0.17. Hemos implementado la aplicación en un cuadro de AIX. Al día siguiente, cuando entro, trato de iniciar sesión en la aplicación. Recibo esta excepción en la página:

Error 500: Error al procesar la solicitud; la excepción anidada es org.springframework.dao.DataAccessResourceFailureException: no se pudo ejecutar la consulta; la excepción anidada es org.hibernate.exception.JDBCConnectionException: no se pudo ejecutar la consulta

Revisé los System.Out y ver más detalles. (Usé pastebin porque el formato del registro realmente estaba arruinando el diseño de la página)


La línea de nuestro código que está causando nuestra excepción es:

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

Estamos cableando la conexión en applicationContext.xml de Spring. Somos conscientes de que la conexión en el AS400 cae a veces (pueden reiniciar el sistema durante la noche, no estoy seguro). Sin embargo, preferiblemente no queremos abrir una nueva conexión cuando estamos conectando todo en el contexto de la aplicación.

Este problema ocurre independientemente del uso de un DataSource / JNDI o JDBC

¿Alguien sabe de alguna configuración para agregar a Spring o Hibernate para verificar si la conexión se daña, y si es así, colóquela y cree una nueva? ¿O alguna otra idea para resolver este problema? Avíseme si necesita más información / código.

Muy apreciado,

Chris

Actualización:

Revisé algunas publicaciones en los foros de Spring Community e implementé mi DataSource con commons-dbcp que tiene algunas propiedades como 'testWhileIdle' y 'validationQuery'. Voy a dejar la aplicación en funcionamiento y volver a verificarla en la mañana. Publicaremos una actualización de los resultados.

Actualización # 2:

El uso de dbcp-commons BasicDataSource parece corregir este problema, que parece ser un problema de red. Websphere ha agrupado las conexiones, y si hay un problema de red en el lado AS400, intentará usar la conexión que tiene, que no sabe que está "obsoleta". Usar una validationQuery con un intervalo de tiempo es una forma económica (pero eficiente) de resolver este problema, pero puede haber una mejor manera en el lado de Websphere, bajo configuración. Pero bien podría no cambiar lo que no está roto, así que hasta que esto falle, probablemente será nuestra solución en el futuro.

¿Fue útil?

Solución

Ah, eso es lo que iba a decir ... el problema debe resolverse en el grupo de conexiones, validando las conexiones antes de devolverlas. DBCP tiene validationQuery, y JBoss también tiene algo similar; Estoy seguro de que Websphere debe tener algo similar en su grupo de conexiones para validar las conexiones antes de distribuirlas. Incluso si no usa testWhileIdle, si se descubre que la conexión no es válida, el grupo crea y le entrega una nueva en lugar de la inválida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top