Newsgroup: it.comp.java
Titolo: Ripristinare connessione al db dopo caduta di servizio

Ciao a tutti,
utilizzo Toplink come persistence provider, e mi chiedevo come fosse
possibile ripristinare la connessione al database dopo una caduta di
servizio.
Mi spiego meglio, con il seguente codice ottengo la connessione JDBC
dall'entityManager:
Connection jdbcConnection =
((oracle.toplink.essentials.ejb.cmp3.EntityManager)
entityManager).getServerSession().getDefaultConnectionPool().acquireConnection().getConnection();
Prima di effettuare operazioni controllo che la connessione sia valida
ed attiva con:
jdbcConnection.isValid(timeout)
Dopo una caduta di servizio o di linea la connessione risulta sempre
non attiva, come potrei fare per ripristinarla senza riavviare
l'applicazione?
Grazie mille in anticipo!

 l'applicazione?
devi acquisire una nuova connessione, che c'entra riavviare l'applicazione?

> devi acquisire una nuova connessione, che c'entra riavviare l'applicazione?
Perfetto, come acquisire una nuova connessione?

 Perfetto, come acquisire una nuova connessione?
forse non ho compreso bene il problema. intendevi dire che la 
connessione restituita dal pool non � pi� valida dopo che c'� stato una 
interruzione? in quei casi si interviene nella configurazione del pool, 
non conosco toplink ma certamente anche lui avr� una sezione di 
configurazione relativa al check della connessione. in pratica, prima di 
restituirti la connessione il pool dovr� verificarne la consistenza e, 
nel caso, scartarla e aprirne un'altra nuova.

 nel caso, scartarla e aprirne un'altra nuova.
Ciao, non so se può esserti utile, ma con mysql, per risolvere lo
stesso problema, ho aggiunto nel file di context di tomcat, dove
descritta la stringa jdbc, il parametro autoReconnect=true, come
segue:
    <Resource
    	name="jdbc/myproject"
    	type="javax.sql.DataSource"
    	username="username"
    	password="password"
    	driverClassName="com.mysql.jdbc.Driver"
    	url="jdbc:mysql://localhost:3306/myproject?autoReconnect=true"
    	maxActive="50"
    	maxIdle="4"
    	maxWait="25"
    	scope="Unshareable"
    	validationQuery="Select 1"
    />
Ciao, Davide.

 Ciao, Davide.
Grazie Davide.
L'applicazione in questione comunque non è una web app, è
un'applicazione swing, ma comunque mi hai suggerito un interessante
suggerimento, cercherò informazioni riguardo "toplink reconnect"...


Ok, perfetto. Se è così allora dovresti avere il modo di configurare
il suo connection pool, un po' quello che si fa con Hibernate, nel suo
hibernate.cfg.xml.
Non conosco Toplink, ma credo abbastanza ragionevolmente che abbia un
file analogo, in cui metti tutti i parametri di configurazione.
Cerca li dentro...
Ciao, Davide.

Trovato la soluzione!
Il problema era dovuto al fatto che Toplink non ha un controllo
automatico delle connessioni inattive. E' possibile risolvere il
problema in due modi:
1) implementando l'interfaccia ExceptionHandler per catturare il
fallimento della connessione e riconnettersi
2) passando da Toplink ad EclipseLink
Siccome Toplink è ormai rimpiazzato da EclipseLink, come si può
leggere sul sito della Oracle 
http://www.oracle.com/technology/products/ias/toplink/jpa/index.html
,
ho deciso di adottare la strategia (2)
-
http://carmelosaffioti.blogspot.com
-