簡體   English   中英

JDBC 最佳實踐

[英]JDBC Best practice

我將創建將在數據庫上運行的 class。 class 將具有 addRecord()、getAllRecords() 等函數。 我正在尋找一種設計 class 的好方法。 我是否必須:1)為每個 function 創建新的連接。 像這樣:

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);
     }
}

並為每個 function 創建語句。

3) 或者別的什么...

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

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

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

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

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

最簡單但不是很優雅的實現是在調用方法(定義事務的邊界)內打開一個Connection並將其作為參數傳遞給您的方法。

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

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

如果有頻繁的常規 jdbc 調用,則使用數據庫連接池

連接池是 go 的方式。 最大的原因是平均而言,數據庫訪問(DML 等)所需的時間遠小於創建連接然后關閉連接所需的時間。 此外,不要忘記在事務完成后關閉您的 ResultSet、PreparedStatement 和 Connection 變量。

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

org.apache.commons.dbcp.*;

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM