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 :

[derby] Problème de déconnexion


Sujet :

JDBC Java

  1. #1
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut [derby] Problème de déconnexion
    Bonjour,

    J'utilise derby comme bdd et j'ai cette erreur :
    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
     
    java.sql.SQLException: org.apache.derby.jdbc.EmbeddedDriver is not registered with the JDBC driver manager
    	at org.apache.derby.jdbc.AutoloadedDriver.getDriverModule(Unknown Source)
    	at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)
    	at java.sql.DriverManager.getConnection(DriverManager.java:582)
    	at java.sql.DriverManager.getConnection(DriverManager.java:154)
    	at vince.dao.DaoTemplate.startDBConnexion(DaoTemplate.java:144)
    	at vince.dao.DaoTemplate.processRequest(DaoTemplate.java:40)
    	at vince.dao.impl.StationDaoImpl.getStation(StationDaoImpl.java:42)
    	at vince.Test.main(Test.java:31)
    Exception in thread "main" java.lang.NullPointerException
    	at vince.dao.DaoTemplate.executeCommande(DaoTemplate.java:87)
    	at vince.dao.DaoTemplate.processRequest(DaoTemplate.java:42)
    	at vince.dao.impl.StationDaoImpl.getStation(StationDaoImpl.java:42)
    	at vince.Test.main(Test.java:31)
    Lorsque je lance une seul requête, cela fonctionne très bien
    Lorsque je lance deux fois la même requête, la deuxième me donne l'erreur ci-dessus. (par exemple un SELECT)
    Je pense que cela vient d'une mauvaise fermeture de connection, statement, ou resultset mais je vois pas l'erreur.


    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
     
    public abstract class DaoTemplate<T extends Entity> {
     
    	//Le driver emmbarqué
    	private String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    	// Le nom de la base
    	private String dbName = "/Users/Shared/database/";
    	// l'URL de la base à utiliser
    	private String connectionURL = "jdbc:derby:" + dbName;
     
    	// Le Prepared Statement
    	private PreparedStatement psInsert;
    	//Le Resultat de la requête
    	private ResultSet resultSet;
     
    	/**
             * Cette methode ouvre une connexion sur la base,
             * execute une commande sql,
             * wrap le resultat pour recuperer un objet,
             * ferme la connexion
             * et renvoie un objet
             * 
             * @return result
             */
    	public T processRequest(String s,boolean returnNeeded) {
    		T entity = null;
    		//Connexion à la base
    		Connection connection = startDBConnexion();
    		//Execution de la requete
    		resultSet = executeCommande(connection,s,returnNeeded);
    		// Si la méthode demande de renvoyer un résultat
    		if(returnNeeded){
    			//Grace a l'appel de la methode abstraite wrapEntity, on recupere le bon Objet: Station, Equipement,...
    			entity = wrapEntity(resultSet);		
    		}
    		//Déconnexion de la base
    		stopDBConnexion(connection);
    		return entity;
    	}
     
    	/**
             * Execute la requete
             * @param connection
             * @param sqlRequest
             * @return resultSet
             */
    	protected ResultSet executeCommande(Connection connection,String sqlRequest,boolean returnNeeded) {
    		resultSet=null;
    		try { 
     
    			 psInsert = connection.prepareStatement(sqlRequest);
    			 if(returnNeeded){
    				 psInsert.executeQuery();
    				 resultSet = psInsert.getResultSet();
    			 } else {
    				 psInsert.executeUpdate();
    			 }
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return resultSet;
    	}
     
    	/**
             * Stop la connexion à la base
             * @param connection
             */
    	protected void stopDBConnexion(Connection connection) {
    		if (driver.equals("org.apache.derby.jdbc.EmbeddedDriver")) {
    			boolean gotSQLExc = false;
    			try {
    				if(resultSet!=null)
    					resultSet.close();
    				if(psInsert!=null)
    					psInsert.close();
    				connection.close();
    				DriverManager.getConnection("jdbc:derby:;shutdown=true");
    			} catch (SQLException se) {
    				if (se.getSQLState().equals("XJ015")) {
    					gotSQLExc = true;
    				}
    			}
    			if (!gotSQLExc) {
    				System.out.println("la base n'a pas été arreté normalement");
    			} else {
    				System.out.println("la base est arreté normalement");
    			}
    		}
    	}
     
    	/**
             * Démarre la connexion à la base
             * 
             * @return connection
             */
    	private Connection startDBConnexion() {
    		Connection connection = null;
    		try {
    			Class.forName(driver);
    			System.out.println(driver + " charge. ");
     
    			Properties p = new Properties();
     
    			p.put("user", "xxxxxx");
     
    			p.put("password", "xxxxx");
    			connection = DriverManager.getConnection(connectionURL, p);
     
    		} catch (java.lang.ClassNotFoundException e) {
    			System.err.print("ClassNotFoundException: ");
    			System.err.println(e.getMessage());
    			System.out
    					.println("\n    >>> Verifier le classpath (libs derby)   <<<\n");
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return connection;
    	}
    }

  2. #2
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Après plusieurs heure devant mon bug, je viens apporter quelques précisions.

    Afin de libérer la base de donnée pour quelle soit utilisable par d'autres utilisateurs, J'ouvre la Base de donnée, j'effectue une requête et je ferme la BDD.

    Différents essais ont démontré qu'après la 1er requête la base se ferme correctement. Le problème se trouve au moment où je souhaites ré-ouvrir la base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    			connection = DriverManager.getConnection(protocol + dbName
                        + ";create=true", props);
    D'avance merci pour votre aide

  3. #3
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Monologue

    Je ne comprend pas pourquoi.... si quelqu'un peut m'expliquer.....

    mais ajoutant newInstance() à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class.forName(driver).newInstance();
    Ca fonctionne !
    Si quelqu'un à des explications, je suis preneur

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 834
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 834
    Points : 990
    Points
    990
    Par défaut
    salut,

    Ton application est une application cliente qui doit se connecter à une BDD (donc un serveur SQL). Je pense que cette commande permet de lancer proprement le serveur (a confirmer, je ne suis pas un expert dans le domaine)

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est normal que tu fasses un shutdown à la fermeture de la connexion ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DriverManager.getConnection("jdbc:derby:;shutdown=true");


    Sinon ta gestion des exceptions n'est pas terrible : tu te contentes de l'afficher et de retourner null... Bien souvent en cas de problème tu va te retrouver avec un NullPointerException à la place d'une SQLException...


    Sinon les PreparedStatement et ResultSet ne devrait pas être définis en attributs d'instances ! Ce devrait être des variables locales


    Quand à la libération des ressources, je préfère de loin l'utilisation d'un try/finally par ressource...


    a++

Discussions similaires

  1. session, problème de déconnexion
    Par Xunil dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2006, 22h50
  2. [derby] Problème d'encodage
    Par le y@m's dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 29/08/2006, 19h18
  3. [Sécurité] Problème de déconnexion
    Par Zvetch dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2006, 13h59
  4. Problème de Déconnexion
    Par Korma dans le forum Langage
    Réponses: 2
    Dernier message: 02/01/2006, 20h28
  5. [Débutant] Problème de déconnexion d'une page JSP
    Par amal9 dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 22/01/2004, 13h40

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