2013-02-04 5 views
0

J'écris une application Java qui utilise Java DB (c'est-à-dire Apache Derby) comme base de données. J'utilise la méthode suivante pour se connecter à la base de données:Comment vérifier si une autre instance de Derby est déjà démarrée?

Connection getConnection() throws SQLException { 

     EmbeddedDataSource ds = new EmbeddedDataSource(); 
     ds.setDatabaseName(dbUri); 
     ds.setPassword(password); 
     ds.setUser(username); 

     Connection conn = ds.getConnection();    
     conn.setSchema(schema); 

     return conn;    
    } 

Cela fonctionne bien, mais parfois je reçois l'exception suivante:

java.sql.SQLException: Another instance of Derby may have already booted the database 

Cela se produit lorsque je lance ma demande et en même temps mySQreuiL SQL Client est connecté à ma base de données. Donc, tout fonctionne comme prévu, mais je voudrais être en mesure de vérifier cela dans ma méthode getConnection(). Autrement dit, je voudrais vérifier si des sessions sont ouvertes à ma base de données, et par exemple, les fermer, lancer ma propre boîte de dialogue d'exception ou d'affichage d'erreur. Je ne sais pas comment faire ça.

Thx

Répondre

0

Plutôt que de déclarer que votre application « jette SQLException », vous pouvez utiliser un bloc « essayer » pour attraper le SQLException, puis examiner l'exception et de décider si elle est l'exception « Une autre instance de Derby » ou pas. Puis, vous pouvez lancer votre propre exception de votre méthode "getConnection" en conséquence.

0

J'ai modifié ma méthode getConnection() à quelque chose comme ci-dessous. Il fait ce que je veux:

Connection getConnection() throws SQLException, DAOConnection { 

     EmbeddedDataSource ds = new EmbeddedDataSource(); 
     ds.setDatabaseName(dbUri); 
     ds.setPassword(password); 
     ds.setUser(username); 

     Connection conn = null; 

     try { 
      conn = ds.getConnection(); 
     } catch (SQLException e) {   

      // check if cannot connect due to "Another instance of 
        // Derby may have already booted the database". 
        // The error code of this exception is 45000. 

      if (e.getNextException().getErrorCode() == 45000) { 
       throw new DAOConnection(e.getNextException().getMessage()); 
      } 

      throw new SQLException(e); 
     } 

     conn.setSchema(schema);       
     return conn;    
    } 
0

Mieux vaut prévenir que guérir. IMO, attraper l'exception, puis se rendre compte qu'il était en double serveur Derby commencé n'est pas un design idéal. Mieux serait d'éviter l'instanciation en double. Si possible, vous pouvez synchroniser votre méthode getConnection() ou l'intégrer à une classe singleton ou charger le pilote Derby intégré à partir du bloc d'initialisation statique d'une classe de démarrage/main qui est chargée une seule fois par JVM et par conséquent, Derby sera démarré uniquement une fois que. Quelque chose comme suit dans la classe principale/démarrage devrait faire l'affaire:

static { 
    try { 
     Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
    } 
    catch(Exception e){ 
    ..... 
    } 
} 

par le lien ici http://db.apache.org/derby/docs/10.3/devguide/tdevdvlp38381.html chargement du pilote devrait démarrer le système embarqué Derby.

Questions connexes