2010-12-06 4 views
0

Bonjour à tous J'essaie de connecter une base de données. ci-dessous j'ai donné le code. Je suis capable de me connecter à la base de données mais je n'arrive pas à me connecter 2ème fois si la différence entre la 1ère fois et la 2ème fois est plus grande que le "délai d'attente" de la base de données mysql. J'utilise la base de données mysql. Je reçois « défaillance de la liaison de communication » problème wait_timeout est de 10 sec (pour des raisons pratiques), il est 8 heures pour mon DB je vous donne le codeJDBC: Impossible de se connecter la deuxième fois

public class DatabaseManager { 
private static Connection jConn; 
private static DatabaseManager manager; 

public Boolean getUser(){ 
    Statement jStmt = null; 
    ResultSet rs = null; 
    try { 

    String query = "SELECT * FROM USER "; 
    System.out.println(query); 
    jStmt = jConn.createStatement(); 
    rs = jStmt.executeQuery(query); 
    while (rs.next()) { 

    } 
    }catch (Exception e) { 
    e.printStackTrace(); 
    return false; 
    } 
    return true; 
} 

    public static synchronized DatabaseManager getInstance() { 
    if (manager == null) { 
    try { 
    manager = initialize(); 
    } catch (DatabaseInitializationException e) { 
    // e.printStackTrace(); 
    // throw new RuntimeException("Database Initialization 
    // Exception"); 
    } 
    } 
    return manager; 
} 
     private static DatabaseManager initialize() 
    throws DatabaseInitializationException { 

    try { 
    Class.forName(serverSrv.readPropertyValue("Srver_Path", 
    "DBdriver")); 
    } catch (ClassNotFoundException e) { 
    throw new DatabaseInitializationException(e.getMessage()); 
    } 
    try { 
    jConn = DriverManager.getConnection("DB_URL","user","password"); 
    System.out.println("Excecuted initialize() for Database "); 
    } catch (SQLException e) { 
    throw new DatabaseInitializationException(e.getMessage()); 
    } 
    return new DatabaseManager(); 
} 
} 

et je teste comme

public static void main(String[] args) { 
    long st = System.currentTimeMillis(); 
    long end ; 
    DatabaseManager dm = DatabaseManager.getInstance(); 

    if(dm.getUser()) 
    System.out.println("success"); 
    else 
    System.out.println("failed.."); 

    do{ 
    end = System.currentTimeMillis(); 
    }while((end-st)<12*1000); 

    if(dm.getUser()) 
    System.out.println("success"); 
    else 
    System.out.println("failed.."); 
} 

et il donne des exceptions comme

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

Last packet sent to the server was 0 ms ago. 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2873) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2763) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3299) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1837) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1961) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2537) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2466) 
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1383) 
at mypackage.db.DatabaseManager.getUser(DatabaseManager.java:127) 
at mypackage.test.Test.main(Test.java:23) 
Caused by: java.net.SocketException: Software caused connection abort: recv failed 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(Unknown Source) 
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113) 
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160) 
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188) 
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2329) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2774) 
+0

"Srver_Path" -> est-ce une faute de frappe? – darioo

+0

êtes-vous derrière proxy? –

Répondre

0

Vérifiez vos paramètres de délai de connexion.

1

Peut-être que vous devriez fermer le ResultSet ainsi que Statement.

Cette link a quelques conseils pour le faire correctement.

+0

Srver_Path n'est pas un problème de typo il localise le serveur mysql – user531260

1

Votre problème est que vous essayez de réutiliser jConn qui se ferme automatiquement après un délai d'expiration. Ainsi, lorsque vous essayez de l'utiliser à nouveau, une exception est levée. Selon ce que vous essayez de faire, je suggère (pour simplifier) ​​..

  1. Fermeture jConn par typeing jConn.close();
  2. Puis, lorsque vous avez besoin d'utiliser à nouveau la base de données, reconnectez-vous en utilisant jConn = DriverManager.getConnection ("DB_URL", "user", "password");
+0

J'essaierais de fermer la connexion et de rouvrir. Si cela fonctionne, votre connexion est automatiquement fermée sur vous. Si ça ne marche pas, alors ... on passe au niveau suivant. – Jay

+0

@ user531260 - vu que vous avez répondu ci-dessous, je vais répondre à votre question ici. Si la performance est une préoccupation, vous devrez regarder la mise en commun des bases de données, par exemple http://commons.apache.org/dbcp/ ou http://sourceforge.net/projects/c3p0 – Paul

Questions connexes