2010-02-19 2 views
11

J'ai une connexion MySQL JDBC en Java. Mon programme fonctionne bien pour l'exécution simple de la requête.MySQLNonTransientConnectionException dans le programme JDBC au moment de l'exécution

Si je lance le même programme pendant plus de 10 heures et exécuter une requête alors que je reçois l'exception MySQL suivante:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Connection.close() has already been called. Invalid operation in 
this state. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
    No operations allowed after statement closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 

Je ne l'ai pas utilisé close() méthode partout. J'ai créé la connexion à la base de données et l'a ouverte pour toujours et toujours exécuté la requête. Il n'y a aucun endroit où j'ai explicitement mentionné le délai d'attente pour la connexion. Je suis incapable d'identifier le problème.

Voici le code que j'utilise pour la connexion de base de données:

String driver = PropertyReader.getDriver(); 
String url = dbURLPath; 
Class.forName(driver); 
connectToServerDB = DriverManager.getConnection(url); 
connectToServerDB.setAutoCommit(false); 

Quelles sont les causes de cette exception?

Répondre

5

Vous devez effectuer une modification dans le fichier de configuration ou augmenter le délai d'attente de votre base de données. Si la base de données reste inactive pendant plus de 8 heures, elle est fermée par défaut.

Merci

23

MySQL met fin à une connexion après un délai de 8 heures. Vous pouvez modifier le délai d'expiration en définissant la variable wait_timeout dans MySQL.

Cependant, en général, ce n'est pas une bonne idée pour une application de maintenir une connexion aussi longtemps. Une meilleure approche consiste à configurer un pool de connexions à l'aide d'une API de regroupement telle que Apache DBCP et à récupérer les connexions du pool plutôt que directement à l'aide d'un pilote. Un pool de connexions prendra également soin de rétablir une connexion groupée si elle meurt pour une raison quelconque, y compris les délais d'expiration.

2

J'ai fait face au même problème aussi. C'est en raison du délai d'attente de connexion par mysql et généralement ce n'est pas une bonne pratique pour étendre le délai d'attente dans mysql car il sert pour beaucoup d'autres applications. Il est bon de reconnecter la base de données aux délais d'attente (c'est-à-dire lorsque cette exception se produit) ou d'utiliser des bibliothèques Open Source pour le regroupement de connexions comme Apache DBCP comme suggéré par @slava. ORM Frameworks prend soin de cela par défaut. À votre santé!!

Questions connexes