IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Connexion JDBC - pooling connexion MySQL


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Points : 16
    Points
    16
    Par défaut Connexion JDBC - pooling connexion MySQL
    Bonjour à tous,

    Je suis actuellement en développement d'une application web en Java-J2EE sur le serveur Tomcat. Cette application utilise une base de données MySQL. Après une nuit d'inactivité, la connexion ne se fait pas au premier chargement de la page web, mais un raffraichissement de celle ci permet d'obtenir cette connexion. Je suis sur ce problème depuis maintenant quelques jours (difficile de faire des tests régulier étant données que le problème n'arrive qu'une fois dans la journée) et je ne sais pas comment je peux le résoudre.
    Voici le code de connexion à la base :

    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
    63
    64
    65
    66
    public class DBConnexion {
     
    	private static DBConnexion db;
    	private DataSource ds;
     
    	private DBConnexion() throws ClassNotFoundException, SQLException{
    		try {
    			Context init = new InitialContext();
    			Context env = (Context) init.lookup("java:/comp/env/");
    			ds = (DataSource) env.lookup("jdbc/poolingConnexion");
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public static synchronized DBConnexion getInstance(){
    		if( db == null ){
    			try {
    				db = new DBConnexion();
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		return db;
    	}
     
    	public synchronized Connection getConnexion(){
    		try {
    			Connection conn = ds.getConnection();
    			if( !isValid(conn)){
    				db = new DBConnexion();
    			}
    			return conn;
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    	public static synchronized ResultSet executeQuery(Statement state, String query){
    		try {
    			return state.executeQuery(query);
    		} catch (SQLException e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    	public static boolean isValid(Connection connection){
    		if(connection==null){
    			return false;
    		}
    		ResultSet ping = null;
    		try{
    			if(connection.isClosed()){return false;}
    			ping = connection.createStatement().executeQuery("SELECT 1");
    			return ping.next();
    		}catch(SQLException sqle){
    			return false;
    		}
    		finally{
    			if(ping!=null){try{ping.close();}catch(Exception e){}}
    		}  
    	}
    Si vous avez quelques idées, je suis preneur!
    Merci.

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Points : 2 560
    Points
    2 560
    Par défaut
    Bonjour,
    j'ai déjà eu ce soucis avec le serveur Mysql en effet. En fait, après une période d'inactivité de l'application qui ne contacte pas le serveur de BD, la connexion vers ce dernier est interrompue. Et lorsque tu essaieras de refaire des requêtes, ça plante. Je n'avais pas fait mon travail avec JDBC, mais plutôt avec JPA, mais pour le régler, j'ai utilisé la librairie c3p0 qui permettait de gérer un pool de connexion entre autre et de garder la connexion active
    Voici le lien vers le site de cette lib http://www.mchange.com/projects/c3p0/index.html
    Je pense et j'espère que tu trouveras ta solution là-bas.
    Si tu trouves la solution, je suis intéressé, histoire que je sois au courant des "petits pièges"
    Bon courage

    Cordialement,
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Points : 16
    Points
    16
    Par défaut Mise en oeuvre
    Salut paissad,

    Je te remercie pour ta réponse!
    Je vais regarder demain (Si je peux réinstaller mon système) ce que je peux faire pour utiliser cette libraire. Dès que la solution sera en place, je te tiendrai au courant.

    Encore merci et bonne soirée

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Je viens donc d'implémenter une connexion avec la librairie c3p0. Cependant, le problème reste le même, la première connexion echoue et la seconde fonctionne. J'ai donc rajouté un Thread.sleep dans le test à la connexion même si ce n'est pas très propre.
    Le code de connexion à la base :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    public class DBConnexion {
     
    	private static DBConnexion db;
    	private ComboPooledDataSource ds;
     
    	private DBConnexion() throws ClassNotFoundException, SQLException{
     
    		ds = new ComboPooledDataSource();
    		try {
    			ds.setDriverClass( "com.mysql.jdbc.Driver" );
    		} catch (PropertyVetoException e) {
    			e.printStackTrace();
    		}
     
    		String host = "jdbc:mysql://"+Configuration.ADRESSE+"/"+Configuration.NOM_BD;
     
    		if( Configuration.PORT.endsWith("-1") ){
    			host += "?autoReconnect=true";
    		}else{
    			host += ":"+Configuration.PORT+"?autoReconnect=true";
    		}
     
    		host += "&zeroDateTimeBehavior=convertToNull";
     
    		//loads the jdbc driver
    		ds.setJdbcUrl(host);
    		ds.setUser(Configuration.UTILISATEUR);
    		ds.setPassword(Configuration.PASSWD);
    		// the settings below are optional -- c3p0 can work with defaults
    		ds.setMinPoolSize(5);
    		ds.setIdleConnectionTestPeriod(3600000);
    		ds.setAcquireIncrement(5);
    		ds.setMaxPoolSize(20);
    		// The DataSource cpds is now a fully configured and usable pooled DataSource
    	}
     
    	public static synchronized DBConnexion getInstance(){
    		if( db == null ){
    			try {
    				db = new DBConnexion();
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		return db;
    	}
     
    	public synchronized Connection getConnexion(){
    		try {
    			Connection conn = ds.getConnection();
    			if( !isValid(conn)){
    				db = new DBConnexion();
    			}
    			return conn;
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    	public static synchronized ResultSet executeQuery(Statement state, String query){
    		try {
    			return state.executeQuery(query);
    		} catch (SQLException e) {
    			System.err.println(query);
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    	public static boolean isValid(Connection connection){
    		if(connection==null){
    			return false;
    		}
    		ResultSet ping = null;
    		try{
    			if(connection.isClosed()){return false;}
    			ping = connection.createStatement().executeQuery("SELECT 1");
    			return ping.next();
    		}catch(SQLException sqle){
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			return false;
    		}
    		finally{
    			if(ping!=null){try{ping.close();}catch(Exception e){}}
    		}  
    	}
    Peut être est ce simplement l'utilisation de cette librairie qui est mauvaise...
    Si vous avez d'autres idées, je suis preneur,

    Merci, Cordialement

  5. #5
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    dans l'URL JDBC essaye de rajouter le paramètre autoReconnect à true.

    la doc :
    http://dev.mysql.com/doc/refman/5.0/...roperties.html
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Le code suivant me permet de me reconnecter à la base de données sans avoir de problème.

    Voici le code que j'ai utilisé :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    public class DBConnexion {
     
    	private static DBConnexion db;
    	private ComboPooledDataSource ds;
     
    	private DBConnexion() throws ClassNotFoundException, SQLException{
     
    		ds = new ComboPooledDataSource();
    		try {
    			ds.setDriverClass( "com.mysql.jdbc.Driver" );
    		} catch (PropertyVetoException e) {
    			e.printStackTrace();
    		}
     
    		String host = "jdbc:mysql://"+Configuration.ADRESSE+"/"+Configuration.NOM_BD;
     
    		if( Configuration.PORT.endsWith("-1") ){
    			host += "?autoReconnect=true";
    		}else{
    			host += ":"+Configuration.PORT+"?autoReconnect=true";
    		}
     
    		host += "&zeroDateTimeBehavior=convertToNull";
     
    		//loads the jdbc driver
    		ds.setJdbcUrl(host);
    		ds.setUser(Configuration.UTILISATEUR);
    		ds.setPassword(Configuration.PASSWD);
    		// the settings below are optional -- c3p0 can work with defaults
    		ds.setMinPoolSize(5);
    		ds.setIdleConnectionTestPeriod(3600000);
    		ds.setAcquireIncrement(5);
    		ds.setMaxPoolSize(20);
    		// The DataSource cpds is now a fully configured and usable pooled DataSource
    	}
     
    	public static synchronized DBConnexion getInstance(){
    		if( db == null ){
    			try {
    				db = new DBConnexion();
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		return db;
    	}
     
    	public synchronized Connection getConnexion(){
    		try {
    			Connection conn = ds.getConnection();
    			if( !isValid(conn)){
    				db = new DBConnexion();
    			}
    			return conn;
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    	public static synchronized ResultSet executeQuery(Statement state, String query){
    		try {
    			return state.executeQuery(query);
    		} catch (SQLException e) {
    			System.err.println(query);
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    	public static boolean isValid(Connection connection){
    		if(connection==null){
    			return false;
    		}
    		ResultSet ping = null;
    		try{
    			if(connection.isClosed()){return false;}
    			ping = connection.createStatement().executeQuery("SELECT 1");
    			return ping.next();
    		}catch(SQLException sqle){
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			return false;
    		}
    		finally{
    			if(ping!=null){try{ping.close();}catch(Exception e){}}
    		}  
    	}
    }
    Merci encore pour ton aide
    Cordialement, Mathieu

  7. #7
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    de rien
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de connexion JDBC avec une base de donne mysql
    Par sultan_kafila dans le forum JDBC
    Réponses: 19
    Dernier message: 12/04/2006, 08h25
  2. Réponses: 2
    Dernier message: 16/01/2006, 11h38
  3. url de connexion JDBC pour BD MySQL distante
    Par dédéf dans le forum JDBC
    Réponses: 5
    Dernier message: 14/01/2006, 14h43
  4. Réponses: 6
    Dernier message: 15/05/2005, 14h11
  5. pool de connexion jdbc avec apache
    Par de LANFRANCHI dans le forum Oracle
    Réponses: 9
    Dernier message: 24/01/2005, 16h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo