2013-03-13 22 views
10

Seçme listeleri için bazı JDBC yapıyorum bir Java programı var. Her defasında DBConnection() çağrılarını her çeviren veya tüm sorgular için bir bağlantıyı yeniden kullanmamı gerektiren her zaman testDataBase() yöntemini çağırmak tavsiye edilir. Şimdiden teşekkürler.JAVA JDBC yeniden bağlantıları

private void testDataBase(String query){Connection con = DBConnection(); 
    Statement st = null; 
    ResultSet rs = null; 

    try { 
     st = con.createStatement(); 
     rs = st.executeQuery(query); 
     boolean flag = true; 
     while (rs.next()) { 
      String resultString = ""; 
      for(int i = 1; i <=rs.getMetaData().getColumnCount();i++){ 
       resultString=resultString+" "+ rs.getString(i); 
      } 
      System.out.println(resultString); 
     } 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 

} finally { 
    if (st != null) { 
     try { 
      st.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
    } 
    } 
    if (rs != null) { 
     try { 
      rs.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
    if (con != null) { 
     try { 
      con.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}    



private Connection DBConnection() { 
    final String method_name = "DBConnection"; 
    Connection conn = null; 
    try{ 
     Class.forName(driver).newInstance(); 
     conn = java.sql.DriverManager.getConnection(url,userName,password); 

     }catch (ClassNotFoundException e) { 
     System.out.println(e.getMessage()); 
    } catch (SQLException e) { 
     System.out.println(e.getMessage()); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 

    return conn; 

} 
+0

Sen Bir senaryo ile ilgili sorgular için bir bağlantı kullanmalıdır. Örnek, yeni bir kullanıcı oluşturuluyor. Ardından bağlantıyı açın, (1) yeni kullanıcı kimliğinin mevcut olup olmadığını kontrol edin, ardından (2) user_table'a ekleyin. Her iki sorgu da tek bağlantı kullanılarak yapılmalıdır. – asifsid88

+0

evet aynı bağlantıyı tekrar kullanabiliriz –

+0

tekli kullanım .. –

cevap

10

DB bağlantısı açmak, perfofmans açısından pahalı bir işlemdir. Farklı istekler arasında bağlantıları paylaşmak için bir ConnectionPool kullanmalısınız.

5

Veritabanı bağlantıları çok uzun sürüyor ve çok düşük sorgulama oranınız olmadıkça yeniden kullanılmalıdır.

4

Veritabanı bağlantısı yapmak oldukça pahalı bir işlem olduğundan, mümkünse bir bağlantıyı yeniden kullanmanız önerilir. Ayrıca, sizin için bir dizi bağlantıyı sürdürecek olan bağlantı havuzunu kullanmayı düşünün, böylece gerektiğinde havuzdan bir tane yakalayabilirsiniz. Yukarıda gösterilen yöntem değişmeye gerek olmayabilir, aradığınız DBConnection() yöntemine bağlıdır.

1

tamamen yapabileceğiniz en yavaş operasyonda birinde bir DB bağlantısı açılıyor performansları açısından, @Amir Kost katılıyorum ve kısıtlayıcı gerçek zamanlı kısıtlamaları varsa bu büyük bir sorun olabilir. Bir çerçeve kullanıp kullanmadığınızı bilmiyorum, ancak iyi bir uygulama, bir bağlantı havuzunu sarmalayan ve her zaman db ile doğrudan etkileşim kurmanız gereken bir fasülyenin yayınlanmasıdır. genellikle "oturum" olarak adlandırılana karşılık gelir. Bu teknikliği yeniden üretmek için size (herhangi bir çerçeve kullanmasanız bile) öneriyorum.

4

Bağlantılar iş parçacığı için güvenli değildir, bu nedenle istekleri onlara göre paylaşmak iyi bir fikir değildir.

Daha iyi bir fikir, bağlantıları birleştirmek ve kapsamlarını olabildiğince dar tutmaktır: bağlantıyı havuzdan kontrol edin, kullanın, işlem kapsamında kapatın. Eğer Connection yalnızca bir örneğini istiyorsanız

-1

, sen Singleton deseni yararlanabilirler, düşünebilirsiniz,:

public class Connector { 

private static final String URL = "jdbc:mysql://localhost/"; 
private static final String LOGIN = "root"; 
private static final String PASSWORD = "azerty"; 
private static final String DBNAME = "videotheque"; 
private static Connector connector; 
private static Connection connection; 

private Connector() { 
} 

public synchronized static Connector getInstance() { 
    if (connector == null) { 
     connector = new Connector(); 
    } 
    return connector; 
} 

public static Connection getConnection() { 
    if (connection == null) { 
     Connection c = null; 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      c = DriverManager.getConnection(URL + DBNAME, LOGIN, PASSWORD); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return c; 
    } 
    return connection; 
} 

}

Ve sonra, arayabilirsiniz: Connector.getInstance().getConnection()

+0

Performans açısından hiçbir şey değişmez. Örneğinizde her seferinde hala DriverManager.getConnection yöntemini çağırıyorsunuz. – ANTARA

İlgili konular