18 mars 2014

HRaSpace et "java.sql.SQLRecoverableException: Il n'y a plus de données à lire dans le socket"


Sur un site l'application HRaSpace était indisponible le lendemain de chaque sauvegarde de la base de données. Sur ce site la base JetSpeed était déportée sur un schéma Oracle.

Le problème rencontré était lié à la gestion du pool de connexion JDBC de Tomcat sur la base Jetspeed. Dans le cas particulier d'une déconnexion (arrêt Oracle) - JetSpeed n'est pas informé de cette fermeture - et le prochain accès provoque l'erreur même si la base est entre temps redémarrée.

Une solution est de paramétrer Tomcat pour qu'il vérifie la validité des connexions dans le pool. Pour cela, modifier le fichier de configuration du pool JDBC en ajoutant un attribut "validationQuery" avec une requête de test (cf documentation Tomcat). Dans le cas de Oracle, la requête peut être du type "select 1 from DUAL"

Exemple de fichier tomcat/conf/Catalina/localhost/hra-space.xml :

<Resource name="jdbc/jetspeed" auth="Container"
validationQuery="select 1 from DUAL"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
type="javax.sql.DataSource" username="<user>" password="<passwd>"
driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@<server>:<port>:<base>"
maxActive="100" maxIdle="30" maxWait="10000"/>



Merci à la HotLine pour cette information.

A noter : En général ce problème n’apparait pas car lors d'une sauvegarde offline (base arrêtée) on ferme l'application Web !