Currently, if the database of our Spring application hosted on Tomcat is unavailable, context initialization fails and all requests return 404.
What would be a good way to overcome this problem? Instead of the application being unavailable until the next Tomcat, I would like it to display an error message to the user when it is unavailable and automatically restored when the database is available (for example, if the database crashes when Tomcat is already running).
I can install all the beans on lazy-init, but I'm not sure what the best solution is? Can Tomcat try to re-initialize every x seconds / requests and show a decent error page? Any ideas on this?
An example of errors that occur at startup when the database is unavailable:
Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database! at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.getTargetConnection(LazyConnectionDataSourceProxy.java:401) at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376) at com.sun.proxy.$Proxy43.getMetaData(Unknown Source) at com.googlecode.flyway.core.dbsupport.DbSupportFactory.getDatabaseProductName(DbSupportFactory.java:103) ... 67 more Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ... 72 more Mar 28, 2013 11:19:47 AM org.apache.catalina.core.StandardContext startInternal SEVERE: Error listenerStart Mar 28, 2013 11:19:47 AM org.apache.catalina.core.StandardContext startInternal SEVERE: Context [] startup failed due to previous errors
Miken source share