Bonjour à tous,

J'utilise JDBC, pour me connecter a MYSQL.
Mais seulement voilà, J'ai au bout de 8 heures d'ouverture de connection un timeout qui me provoque une erreur:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 45 496 828 milliseconds ago.
The last packet sent successfully to the server was 1 milliseconds ago.

le Wait Time out est configuré:
wait timeout : 28 800
Equivalent de 8heures.

Grosso-modo, j'ouvre la connexion et je ne la referme jamais.
Car si je la ferme et la ré-ouvre a chaque requête, j'ai l'erreur: "too many connections"

Voici mon code:
JdbcConnector
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class JdbcConnector {
	static Logger logger = Logger.getLogger("JdbcConnector.class");
	private static Connection connect;
 
	/**
         * Méthode qui va retourner notre instance
         * et la créer si elle n'existe pas...
         * @return
         */
	public static Connection getInstance(){
		try {
			if(connect == null || connect.isClosed()){
				try {
					//On regarde les préférences:
					Serializer<Preferences> preferences = new Serializer<Preferences>(new File("file/Pito.lic"));
					preferences.lectureserialize();
					Serializer<Licence> licence = new Serializer<Licence>(new File("file/sack.lic"));
					licence.lectureserialize();
					String serveur=(licence.getObject()!=null && licence.getObject().getType_licence().equals("normal"))?"localhost":preferences.getObject().getServeur();
					if(preferences.getFile().length() > 0 && preferences.getObject().isConnection_bdd()){
						logger.info("Lecture Préférence: "+preferences.getObject().toString());
						Properties props = new Properties();
						props.setProperty("user",preferences.getObject().getUtilisateur());
						props.setProperty("password",preferences.getObject().getPassword());
						props.setProperty("autoReconnect", "true");
						connect = DriverManager.getConnection("jdbc:mysql://"+serveur+"/"+preferences.getObject().getBase(),props);
						logger.info("Connection a la base de donnée: "+connect);
					}
					else{
						connect=null;
						JOptionPane.showMessageDialog(null, "Impossible de se connecter!", "ERREUR DE CONNEXION ! ", JOptionPane.ERROR_MESSAGE);
					}
				} catch (SQLException e) {
					JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR DE CONNEXION ! ", JOptionPane.ERROR_MESSAGE);
				}
			}
		} catch (HeadlessException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR DE CONNEXION ! ", JOptionPane.ERROR_MESSAGE);
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR DE CONNEXION ! ", JOptionPane.ERROR_MESSAGE);
		}
		return connect;	
	}
 
	public static void test_connection(String serveur, String base, String utilisteur, String passe) {
		// TODO Auto-generated method stub
		try {
			connect = DriverManager.getConnection("jdbc:mysql://"+serveur+"/"+base, utilisteur, passe);
			JOptionPane.showMessageDialog(null, "La connection avec la base de donnée est réussi!", "CONNECTION A LA BASE MYSL AVEC SUCCES! ", JOptionPane.INFORMATION_MESSAGE);
		} catch (HeadlessException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR DE CONNEXION ! ", JOptionPane.ERROR_MESSAGE);
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR DE CONNEXION ! ", JOptionPane.ERROR_MESSAGE);
		}
 
	}
 
}
Classe MembresDao extends DAO<Membres>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public ArrayList<Membres> select(String champ, String valeur, int admin) {
		connect= JdbcConnector.getInstance();
		try {
			Statement state = this.connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
	            PreparedStatement prepare = this.connect.prepareStatement(
	            		"SELECT m.id, m.nom, m.prenom, m.passe, m.solde, m.afficher, m.admin, m.forfait "+
	            		"FROM membres m " +
	            		"WHERE `"+champ+"`=? " +
	            		"ORDER BY m.nom, m.prenom ASC");
 
	            //On paramètre notre requête préparée
	            prepare.setString(1, valeur);
 
		//On exécute la requête
		ResultSet resultat = prepare.executeQuery();
		int i=0;
		while(resultat.next()){
			table.add(i, new Membres(resultat.getInt("m.id"), resultat.getString("m.nom"), resultat.getString("m.prenom"), resultat.getString("m.passe"), 
							resultat.getFloat("m.solde"), resultat.getInt("m.afficher"), resultat.getInt("m.admin"), resultat.getInt("m.forfait")));
			i++;
		}
 
		prepare.close();
   	 	state.close();
 
		} catch (SQLException e) {
			e.printStackTrace();
	    }
		return table;
	}
Je vous remercie pour vos réponses