Domanda

Stiamo usando Spring 2.5.4 / Hibernate 3.2 / Websphere Application Server 6.1.0.17. Abbiamo distribuito l'applicazione su una scatola AIX. Il giorno dopo, quando entro, provo ad accedere all'applicazione. Ottengo questa eccezione sulla pagina:

Errore 500: elaborazione richiesta non riuscita; l'eccezione nidificata è org.springframework.dao.DataAccessResourceFailureException: impossibile eseguire la query; l'eccezione nidificata è org.hibernate.exception.JDBCConnectionException: impossibile eseguire la query

Ho controllato i System.Out e vedere ulteriori dettagli. (Usato pastebin perché la formattazione del registro stava davvero rovinando il layout della pagina)


La riga del nostro codice che sta causando la nostra eccezione è:

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

Stiamo collegando la connessione in applicationContext.xml di Spring. Siamo consapevoli che a volte la connessione su AS400 si interrompe (potrebbero riavviare il sistema durante la notte - non ne sono sicuro). Tuttavia, preferibilmente non vorremmo aprire una nuova connessione quando cabliamo tutto in applicationContext.

Questo problema si verifica indipendentemente dall'utilizzo di un DataSource / JNDI o JDBC

Qualcuno sa delle impostazioni da aggiungere a Spring o Hibernate per verificare se la connessione diventa stantia e, in tal caso, rilasciarla e crearne una nuova? O altre idee per risolvere questo problema? Fammi sapere se hai bisogno di maggiori informazioni / codice.

Molto apprezzato,

Chris

Aggiornamento:

Ho controllato alcuni post sui forum della community di Spring e ho implementato il mio DataSource con commons-dbcp che ha alcune proprietà come 'testWhileIdle' e 'validationQuery'. Lascio l'app in esecuzione e la ricontrollo in AM. Pubblicherà un aggiornamento sui risultati.

Aggiornamento # 2:

L'uso di dbcp-commons BasicDataSource sembra correggere questo problema, che sembra essere un problema di rete. Websphere ha un pool di connessioni, e se c'è un problema di rete sul lato AS400, proverà ad usare la connessione che ha, che non sa che è "stantio". L'uso di una validationQuery con un intervallo di tempo è un modo economico (ma efficiente) per risolvere questo problema, ma potrebbe esserci un modo migliore sul lato Websphere, in configurazione. Ma potrebbe anche non cambiare ciò che non è rotto, quindi fino a quando non fallirà, sarà probabilmente la nostra soluzione per il futuro.

È stato utile?

Soluzione

Ah, questo è quello che stavo per dire ... il problema deve essere risolto nel pool di connessioni, convalidando le connessioni prima di restituirle. DBCP ha validationQuery e anche JBoss ha qualcosa di simile; Sono sicuro che Websphere deve avere qualcosa di simile nel suo pool di connessioni per convalidare le connessioni prima di distribuirle. Anche se non usi testWhileIdle, se la connessione non è valida, ne viene creata una nuova che ti viene consegnata dal pool anziché non valida.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top