2011-05-29 63 views
6

我要創建將在數據庫上運行的類。該類將具有函數addRecord(),getAllRecords(),類似的東西。我正在尋找一種設計課程的好方法。我需要: 1)爲每個功能創建新的連接。就像這樣:JDBC最佳實踐

void readRecords(){ 
    try { 
     Connection con = DriverManager.getConnection (connectionURL); 

     Statement stmt = con.createStatement(); 

     ResultSet rs = stmd.executeQuery("select moviename, releasedate from movies"); 

     while (rs.next()) 
      System.out.println("Name= " + rs.getString("moviename") + " Date= " + rs.getString("releasedate"); 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     con.close(); 
    } 
} 

2)最好是有一個連接可變

class MyClass{ 
    private Connection con; 

    public MyClass(){ 
      con = DriverManager.getConnection (connectionURL); 
    } 
} 

一個memeber併爲每個函數創建只是聲明。

3)或別的東西......

回答

6

如果經常定期JDBC調用,然後使用一個數據庫connection pool

3

連接池是要走的路。最大的原因是平均而言,訪問數據庫所需的時間(DML等)要比創建連接所需的時間少得多,然後關閉連接。另外,不要忘記在事務完成後關閉你的ResultSet,PreparedStatement和Connection變量。

您可以使用tomcat或apache連接池類。 這些類是在包中定義的,例如

org.apache.commons.dbcp。*;

org.apache.tomcat.dbcp.dbcp。*;

其中dbcp代表數據庫連接池。

11

兩種方法都不好。第一個不允許你實現正確的事務管理,因爲你不能在同一事務中調用多個方法。後者需要不必要地創建多個對象。

最好的方法是引入當前連接的概念,它可以從某種事務上下文中獲得。基本上,它應該是這樣的:

beginTransaction(...); // Opens connection and starts transaction 

readRecords(...); // Uses the current connection 
addRecord(...); 
... 

commitTransaction(...); // Commits transaction and closes connection 

的simpliest但不是很優雅的實現是打開Connection調用方法中(其中定義事務的邊界),並把它傳遞給你的方法作爲參數。

更復雜的解決方案是爲當前的Connection創建一個static ThreadLocal存儲,將它放在那裏當您開始一個事務並從您的方法中的存儲中獲取它時。有些框架隱式實現這種方法,例如,Spring Framework

請注意,連接池與這些問題完全正交。

+0

+1我真的很好soln ...事實上,我們在很多地方使用它......但可能和OP的矯枉過正...但仍然可行 – 2011-05-30 03:50:52