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 :

Fermer ou pas la connection :(


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut Fermer ou pas la connection :(
    Bonjour... je me trouve devant un problème.

    Voici comment je faisais avant :

    J'avais une classe Connexion qui créait à chaque connexion.execute(String sql) ou connexion.executeUpdate(String sql) une nouvelle Connection vers ma base de données.

    Une importation de données à l'aide de java, depuis une ancienne base de données prend alors 50 minutes.

    Je me suis dis..ah peut-être si j'utilisais toujours la même Connection !

    J'ouvre ma connection qu'une seule fois (Elle est static dans ma classe Connexion) et tout d'un coup... WOW 13 minutes pour mon importation.

    Mais gros bémol !

    Quand j'exécute des requêtes du genre "Insert","Update","Delete", la base de données ne semble pas vraiment se mettre à jour !!!!

    C comme si justement en ayant gardé la même connection j'avais toujours la même référence de la bd et de ses données donc si j'ai fait delete, il y a toujours un tel élément dans mon graphique.

    Quelqu'un peut m'aider à savoir quoi faire pour la Connection ???

    Voici le code de mes 2 versions :


    Version 1.2 (1 seule connexion):

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    package connexionBD;
     
    import java.sql.*;
     
     
     
    //Cette classe sert à faire la connexion à la base de données Microsoft Access
    public class Connexion{
     
    	private Statement s;
    	private Connection con;
    	private boolean erreur = false;
     
    	/*
    	 * Quand on instancie cette classe, on ouvre une connexion automatiquement.
    	 */
    	public Connexion()
    	{
     
    		ouvrirConnexion();
     
    	}	
     
    	/*
    	 * Cette méthode sert à ouvrir une connexion sur la base de données.
    	 */
     
    	public void ouvrirConnexion(){
     
            try {
            	Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     
            	String dataSourceName = "bd";
            	String dbURL = "jdbc:odbc:" + dataSourceName;
     
            	con = DriverManager.getConnection(dbURL); 
     
            	s = con.createStatement();
     
            }
            catch (Exception err) {
            	System.out.println("ERROR: " + err);
            	erreur=true;
            }
     
    	}
     
    	/*
    	 * Cette méthode retourne le résultat d'une requête à la base de données.
    	 */
    	public ResultSet execute(String sql){
     
    		ResultSet rs = null;
     
    		try{
    			rs = s.executeQuery(sql);
    		}catch(Exception e){
    			System.out.println(e.getMessage());
    			System.out.println("***************************************************");
    			System.out.println("Exécution échouée / The execution failed.");
    			System.out.println(sql);
    			System.out.println("***************************************************");
    			erreur=true;
    		}
     
    		return rs;
     
    	}
     
    	//Méthode servant à faire une modification à la base de données (UPDATE,DELETE,INSERT)
    	public void executeUpdate(String sql){
     
    			try {
     
     
    				System.out.println();
    				System.out.println("**************************");
    				System.out.println(sql);
    				s.executeUpdate(sql);
    				System.out.println("**************************");
    				System.out.println();
     
    			} catch (SQLException e) {
    				System.out.println("Exécution échouée / The execution failed.");
    				System.out.println(sql);
    				System.out.println(e.getMessage());
    				e.printStackTrace();
    				erreur = true;
    			}
     
    	}
     
    	/*
    	 * Ferme la connexion à la base de données.
    	 */
    	public void fermerConnexion(){
     
    		try{
     
    			con.close();
    			s.close();
     
    		}catch(Exception e){
    			System.out.println(e.getMessage());
    			erreur = true;
    		}
    	}
     
    	public boolean aDesErreurs(){
     
    		return erreur;
     
    	}
     
     
    }
    Version 1.1

    (Création d'une connection à chaque instance de Connexion(des centaines de milliers pendant l'importation):

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    package connexionBD;
     
    import java.sql.*;
     
     
     
    //Cette classe sert à faire la connexion à la base de données Microsoft Access
    public class Connexion {
     
    	private Statement s;
     
    	private static String dataSourceName = "bd";
    	private static String dbURL = "jdbc:odbc:" + dataSourceName;
    	private static Connection con; 
    	private boolean erreur = false;
    	private static boolean ouverte = false;
     
    	/*
    	 * Quand on instancie cette classe, on ouvre une connexion automatiquement.
    	 */
    	public Connexion()
    	{
    		if(!Connexion.ouverte){
    			Connexion.ouverte= true;
    			 try {
    				con = DriverManager.getConnection(dbURL);
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
     
    		ouvrirConnexion();
     
    	}	
     
    	/*
    	 * Cette méthode sert à ouvrir une connexion sur la base de données.
    	 */
     
    	public void ouvrirConnexion(){
     
            try {
            	Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            	s = con.createStatement();
            }
            catch (Exception err) {
            	System.out.println("ERROR: " + err);
            	erreur=true;
            }
     
    	}
     
    	/*
    	 * Cette méthode retourne le résultat d'une requête à la base de données.
    	 */
    	public ResultSet execute(String sql){
     
    		ResultSet rs = null;
     
    		try{
    			rs = s.executeQuery(sql);
    		}catch(Exception e){
    			System.out.println(e.getMessage());
    			System.out.println("***************************************************");
    			System.out.println("Exécution échouée / The execution failed.");
    			System.out.println(sql);
    			System.out.println("***************************************************");
    			erreur=true;
    			System.exit(0);
    		}
     
    		return rs;
     
    	}
     
    	//Méthode servant à faire une modification à la base de données (UPDATE,DELETE,INSERT)
    	public void executeUpdate(String sql){
     
    			try {
     
     
    				//System.out.println();
    				//System.out.println("**************************");
    				//System.out.println(sql);
    				s.executeUpdate(sql);
    				//System.out.println("**************************");
    				//System.out.println();
     
    			} catch (SQLException e) {
    				System.out.println("Exécution échouée / The execution failed.");
    				System.out.println(sql);
    				System.out.println(e.getMessage());
    				e.printStackTrace();
    				erreur = true;
    				System.exit(0);
    			}
     
    	}
     
    	/*
    	 * Ferme la connexion à la base de données.
    	 */
    	public void fermerConnexion(){
     
    		try{
     
    			s.close();
     
    		}catch(Exception e){
    			System.out.println(e.getMessage());
    			erreur = true;
    		}
    	}
     
    	public boolean aDesErreurs(){
     
    		return erreur;
     
    	}
     
     
    }
    J'aimerais bien avoir 1 seule connexion... mais on dirait que certaines requêtes delete ou update ne fonctionnent pas sur la bd quand je suis dans ce mode ^

  2. #2
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Bonjour,

    Plusieurs choses
    - mettre en place un pool de connexion, c'est la bonne solution... Il faut donc impérativement que tu partes sur le 2ieme solution ! Mais il y a de très bon pool aujourd'hui (même en temps que tutoriel -et donc avec un source), sans que tu aies besoin de faire toi-même.
    - pour les problémes avec les delete, update... je regaderai la base, si tu as les droits de faire cela -administration de base- et aussi si le drier ODBC te permet de faire cela... (ODBC est beau sur le papier, mais en vrai ). Mais je regarderai aussi ton code, et le mélange avec les varaibles statics et le varaibles d'instances.

    Commentaires sur ton code : utilise plutôt le code suivant, il générera mois de soucis en cas d'erreur de connexion:
    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
     
    public Connexion()
    {
    	if(!Connexion.ouverte){
    		try {
            		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    			con = DriverManager.getConnection(dbURL);
    			Connexion.ouverte= true;
     
    		} catch (SQLException e) {
    			e.printStackTrace();
    			Connexion.ouverte= false;
    		}
    	}
    }
    - Lors de la fermeture, il te faut tester si la connexion est ouverte (Connexion.ouverte) afin de ne pas générer des exception inutiles
    - fait plutôt la fermerture du statement et ensuite, celle de la connexion (mais tu peux aussi fermer la connexion simplement):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    s.close();
    con.close();
    et il te faut instancier un seul objet pour faire 'SELECT...' et 'UPDATE...', car ton statement n'est pas static.

  3. #3
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Pour ton problème de insert, update et delete qui ne semble pas être effectué je pense que ça peut venir d'un commit automatique qui était fait quand tu fermais ta connexion (et qui n'est donc plus fait maintenant). Tu devrais modifier ta méthode executeUpdate comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void executeUpdate(String sql){
    			try {
    				s.executeUpdate(sql);
                                    con.commit();
    			}
                             .....
    =
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Merci pour vos précieux conseils... pour le commit, je crois bien que c ca !

    pcq j'avais une classe que j'utilisais avant qui a toujours bien fonctionné et qui tout à coup ne fonctionnait plus (la classe date d'il y a 3 mois et contient des requêtes pour les utilisateurs du système), puis là le upadte ou delete semblait être fait avec succès mais pas dans la bd.

    Je vais essayer ça et je vous en donne des nouvelles.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    accesoirement, si tu te retrouve avec 2 connection en parallère, la premier faisant des insert, delete, etc, la deuxième ne verra pas les résultat tant que la première n'aura pas fait son commit.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    J'ai quelque chose de bizarre, là je mets le con.commit() à chaque executeUpdate().

    Mais je ne comprends pas pourquoi, j'utilise une classe

    Session qui fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Connexion connexion = new Connexion();
    		String cmdFermerSession = "DELETE FROM UTILISATEURS_CONNECTES WHERE NOM_UTILISATEUR_CONNECTE = '"+utilisateur.replaceAll("'","''")+"'";
     
    		connexion.executeUpdate(cmdFermerSession);
    		connexion.fermerConnexion();
     
    		Connexion.fermerConnection();
    Puis ça marche quand je l'utilise dans une certaine page, et quand j'utilise cette même fonction ailleurs, elle ne marche pas... et quand j'affiche la requête c la mm qui est exécutée... mais on dirait qu'elle ne fait carrément pas l'opération... pourtant j'ai fait un commit !

  7. #7
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Tu peux donner le CODE du pool de connexion que tu as mis jour ? toutes les lignes... suite aux commentaires que je t'ai fait... Tu dois avoir une instance qui en cache une autre.

    merci.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 511
    Points : 386
    Points
    386
    Par défaut
    - fait plutôt la fermerture du statement et ensuite, celle de la connexion (mais tu peux aussi fermer la connexion simplement):
    Je te conseille vivement des clore tes statement car la cloture de la connexion ne clôt pas l'instance stmt et le gabagecollector ne libère pas systématiquement la mémoire de ce fait tu risques des plantages serveur (tomcat pour moi) ou un ralentissement serveur bdd sans savoir d'où ça vient (pb auquel j'ai été confronté de longues semaines) surtout si tu sollicites le pool.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Tu peux donner le CODE du pool de connexion que tu as mis jour ? toutes les lignes... suite aux commentaires que je t'ai fait... Tu dois avoir une instance qui en cache une autre.

    merci.
    Je n'ai pas encore réglé le problème avec le pool de connexion.

    Pour ce qui est du statement, je le close déjà.

    Je pense tout simplement à miniser mes connexions en utilisant une même connexion tant et aussi longtemps que la base de données n'a pas de modifications. Dès qu'il y a un update, je met à jour la connexion.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 511
    Points : 386
    Points
    386
    Par défaut
    J'avais oublié un détail si tu fais des extractions n'oublie pas de mettre le resultset close aussi. Surtout si elles portent sur de gros volumes ou mettent en jeu plusieurs tables toujours pour le même pb de libération de ressources.

Discussions similaires

  1. [VB.NET] Pourquoi je ne peux pas me connecter à une base SQL ?
    Par Hakki dans le forum Accès aux données
    Réponses: 1
    Dernier message: 13/09/2006, 11h35
  2. J'arrive pas a connecter a une base access
    Par yahia1982 dans le forum Bases de données
    Réponses: 6
    Dernier message: 01/08/2006, 13h31
  3. Réponses: 4
    Dernier message: 06/07/2006, 17h14
  4. Je n'arrive pas à me connecter au chat
    Par méphistopheles dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 27/03/2006, 21h16
  5. Windows sockets : ne peut pas me connecter au serveur...
    Par kernigansnotdead dans le forum Windows
    Réponses: 13
    Dernier message: 11/09/2005, 16h00

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