views:

1128

answers:

1

Hello,

We're using Spring 2.5.4/Hibernate 3.2/Websphere Application Server 6.1.0.17. We've deployed the application on an AIX box. The next day when I come in, I try to log into the application. I get this exception on the page:

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

I checked the System.Out logs and see further details. (Used pastebin because the log formatting was really screwing up the page layout)


The line of our code that is causing our exception is:

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

We are wiring the connection in Spring's applicationContext.xml. We are aware that the connection on the AS400 drops at times (they may restart the system overnight--I'm not sure). However, we would preferably not want to open a new connection when we are wiring everything in the applicationContext.

This problem occurs irregardless of using a DataSource/JNDI or JDBC

Does anybody know of any settings to add to either Spring or Hibernate to check if the connection gets stale, and if so, drop it and create a new one? Or any other ideas to resolve this issue? Let me know if you need more information/code.

Much appreciated,

Chris

Update:

Checked out some posts on the Spring Community Forums and I've implemented my DataSource with commons-dbcp which has some properties like 'testWhileIdle' and 'validationQuery'. I'm going to leave the app running and check it again in the AM. Will post an update on the results.

Update#2:

Using dbcp-commons BasicDataSource seems to correct this issue, which appears to be a network problem. Websphere has pooled connections, and if there's a network issue on the AS400 side, it will try to use the connection it has, which it doesn't know is 'stale'. Using a validationQuery with a time interval is a cheap (but efficient) way to solve this problem--but there may be a better way on the Websphere side, under configuration. But, might as well not change what's not broken, so until this fails, it will probably be our solution going forward.

+1  A: 

Ah, that's what I was gonna say... the problem must be solved in the connection pool, by validating connections before returning them. DBCP has validationQuery, and JBoss also has something similar; I'm sure Websphere must have something similar in its connection pool to validate connections before handing them out. Even if you don't use testWhileIdle, if the connection is found to be invalid, a new one is created and handed to you by the pool instead of the invalid one.

Chochos