2013-03-28 9 views
6

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 
+0

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

+0

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

+0

Si sta utilizzando il pool di connessioni per l'origine dati? –

risposta

1

Dal stack eccezione vedo che si sta utilizzando pool di connessioni c3p0. Guarda http://www.mchange.com/projects/c3p0/#configuring_recovery dove puoi configurare il tuo pool per riprovare per la connessione.

Ma questo manterrebbe attivo il thread http e immagina che se il carico è elevato il sistema si spegnerà.

È consigliabile visualizzare una pagina di errore per l'utente. In questo caso mostrerei un errore 503. Puoi farlo mettendo il server web Apache davanti al tuo tomcat in cui si ospita la pagina 503. Ci potrebbero essere altri modi per ottenere questo anche.

Poiché la tua webapp non verrà avviata, non puoi pubblicare la pagina di errore dalla tua webapp a meno che non la configuri come init pigro.

È anche possibile provare l'aggiornamento automatico nella pagina di errore ogni X secondi per l'utente url che stava tentando di visitare.

+0

Grazie, ma questa non è certo la soluzione che sto cercando, poiché l'app Web non verrà mai avviata in questo modo. – MikeN

Problemi correlati