2011-08-22 6 views
6

Sto sviluppando un'applicazione con GWT, Hibernate (mapping basato su XML), MySQL- in Tomcat6.0. IDE- Netbeans 6.9 Ho impostato l'opzione "Distribuisci su Salva" delle proprietà del progetto in Netbeans.Accesso illegale: questa istanza dell'applicazione Web è stata già arrestata

Quando la mia applicazione è in esecuzione per lungo tempo in assistente di tanto in tanto la mia domanda non riesce a connettersi al database e lancia il seguente eccezione

L'eventuale traccia seguente stack è causato da un errore gettato a scopo di debug, nonché come per tentare di terminare il thread
che ha causato l'accesso illegale e non ha alcun impatto funzionale.

java.lang.IllegalStateException 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1273) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316) 
     at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4273) 
     at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1444) 
     at org.hibernate.connection.DriverManagerConnectionProvider.close(DriverManagerConnectionProvider.java:152) 
     at org.hibernate.connection.DriverManagerConnectionProvider.finalize(DriverManagerConnectionProvider.java:142) 
     at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) 
     at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83) 
     at java.lang.ref.Finalizer.access$100(Finalizer.java:14) 
     at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 

Quando si riavvia il server Tomcat sono di nuovo in grado di collegare il Database.Please dimmi il modo attraverso il quale posso ottenere prestazioni senza soluzione di continuità e di poter ottenere il lavoro svolto senza riavviare il Tomcat.

risposta

5

Probabilmente si stanno aprendo sempre più connessioni e non si chiudono mai, raggiungendo infine il numero massimo di connessioni configurato del database.

Trova dove stai aprendo le connessioni e assicurati di chiuderle. Se apri una connessione per ogni richiesta ma non la chiudi, è facile trovarla e correggerla. Oppure potresti non chiudere la connessione quando ricevi un errore - controlla il codice di gestione delle eccezioni.

L'approccio consigliato quando si utilizzano connessioni DB è quello di utilizzare un try finally per fare un massimo sforzo alla chiusura connessioni DB:

Connection con; 
try { 
    con = ...; // open connection 
    // do work 
catch (SQLException e) { 
    // do whatever 
} finally { 
    if (con != null && !con.isClosed()) { 
     try { 
      con.close(); 
     catch (SQLException e) { 
      // Don't throw from here or you'll lose any return/exception from above 
      log.error("Failed to close connection", e); 
     } 
    } 
} 
+0

IMHO, se era il caso, mi sarei aspettato un errore 500 e non quello quello è segnalato. In realtà servlet che non hanno bisogno della connessione DB dovrebbero funzionare ancora. – SJuan76

+0

I Servlet che non hanno bisogno di DB stanno lavorando bene ... –

+0

Allora cerca la soluzione di Bohemian (eppure continuo a pensare che sia un messaggio piuttosto ingannevole ...) – SJuan76