2012-12-01 4 views
2

J'ai un programme multithread qui est censé fonctionner 24/7, parfois je verrais quelques threads se bloquer juste après un certain temps le programme s'exécute, aucune exception ou erreur. Ça ne ferait rien. J'ai couru une décharge de fil pour voir quel est le problème et c'est la threaddump connexe pour le fil qui ne faisait rienThread se bloque sur DriverManager.getConnection

"Thread2" prio=6 tid=0x0000000014814000 nid=0xbf8 runnable [0x00000000159fe000] 
    java.lang.Thread.State: RUNNABLE 
     at java.net.SocketInputStream.socketRead0(Native Method) 
     at java.net.SocketInputStream.read(Unknown Source) 
     at java.net.SocketInputStream.read(Unknown Source) 
     at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:143) 
     at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:112) 
     at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:71) 
     at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:272) 
     at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:269) 
     at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:106) 
     at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64) 
     at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:123) 
     at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:28) 
     at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:20) 
     at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30) 
     at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:22) 
     at org.postgresql.Driver.makeConnection(Driver.java:391) 
     at org.postgresql.Driver.connect(Driver.java:265) 
     at java.sql.DriverManager.getConnection(Unknown Source) 
     at java.sql.DriverManager.getConnection(Unknown Source) 
     at database.Database.isItInDatabase(Database.java:1108) 
     at miner.Miner.run(Miner.java:145) 
     at java.lang.Thread.run(Unknown Source) 

et ci-dessous est la méthode de base de données

public Boolean isItInDatabase(String userName) throws SQLException 
{ 
    Connection conn = null; 
    PreparedStatement pst = null; 
    ResultSet rs = null; 
    Boolean exists = false; 

    try 
    { 
     Class.forName("org.postgresql.Driver"); 
     conn = DriverManager.getConnection("jdbc:postgresql://MYSERVERIP:5432/" + database, username, password); //--->>>>>>line 1108 
     pst = conn.prepareStatement("SELECT COUNT(*) FROM listing_info where listing_url = ?"); 
     pst.setString(1, userName); 

     rs = pst.executeQuery(); 
     while (rs.next()) 
     { 
      exists = rs.getBoolean(1); 
     } 

    } 
    catch (Exception e) 
    { 
     System.out.println(e); 
    } 
    finally 
    { 
     pst.close(); 
     rs.close(); 
     conn.close(); 
    } 

    return exists; 
} 

J'ai marqué où la ligne 1108 est dans mon fichier de base de données. Est-ce que je peux faire quelque chose pour résoudre ce problème? alors le programme n'attend pas là pour toujours?

Répondre

5

Cela n'a rien à voir avec les bases de données. c'est une connexion de socket accrochée. Cela arrive quand la connexion du socket est cassée. La seule façon de l'empêcher d'être suspendu est d'utiliser des délais d'attente de lecture de socket. On dirait qu'il y a quelques jdbc driver config properties pour postgresql qui va résoudre le problème.