Attualmente, se il database della nostra primavera applicazione ospitata su Tomcat non è disponibile, l'inizializzazione contesto non riesce e restituire tutte le richieste di un 404.Manipolazione Primavera/Tomcat errori di inizializzazione
Quale sarebbe un buon modo per superare questo problema? Anziché l'app non è disponibile fino al prossimo Tomcat, mi piacerebbe che mostrasse un messaggio di errore all'utente mentre non era disponibile e si ripristina automaticamente quando il database è disponibile (come se dovesse verificarsi un errore del database mentre Tomcat è già in esecuzione).
Posso impostare tutti i bean su lazy-init, ma non sono sicuro che sia la soluzione migliore? Tomcat non può ritentare l'inizializzazione ogni x secondi/richieste e mostrare una pagina di errore decente nel frattempo? Qualche idea su questo?
Un esempio degli errori gettati all'avvio quando il DB non è disponibile:
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
forse sarebbe meglio concentrarsi sul fatto che il tuo db sia disponibile/affidabile prima ... ma un 404 personalizzato è piuttosto semplice: http://stackoverflow.com/questions/1196569/custom-404-using-spring -dispatcherservlet – NimChimpsky
Non posso aspettarmi che i miei clienti eseguano gli aggiornamenti di Windows esattamente nell'ordine corretto, non in un ambiente server con centinaia di server, quindi a volte il server DB potrebbe essere inattivo quando viene visualizzato il server dell'app. Una 404 personalizzata non è possibile con il link che hai dato (poiché la webapp non è caricata), potrei configurare un 404 personalizzato in Tomcat, ma questo non risolverà il problema. Quello che voglio è che Spring/Tomcat riprovi e tenti di ottenere l'app, invece di fallire dopo 1 tentativo. – MikeN
Si sta utilizzando il pool di connessioni per l'origine dati? –