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:
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:
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 ^