簡體   English   中英

JDBC 和連接池選項

[英]JDBC and connection pools options

我必須實現一個連接池以及標准 JDBC DAO 和一個 SQLite 數據庫。 實現將重用數據庫連接以減少 web 應用程序開銷的連接池的最簡單選項是什么? 這是我編碼的內容:

package persistance;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SQLite {

    Connection conn = null;
    Statement stat = null;

    public SQLite(String path) {
        String dbPath = path + "GTI525.db";
        System.out.println(dbPath);
        try {
            Class.forName("org.sqlite.JDBC");
            conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
            stat = conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public ResultSet query(String sql) {
        ResultSet rs = null;
        try {
            rs = stat.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
}

不要編寫自己的數據庫連接池。 有許多很棒的現成開源實現。

如果是 web 應用程序,當代所有主流應用程序服務器都包含數據庫連接池,通常通過 JNDI 配置。 下面概述了如何在 Tomcat 中設置基於 JNDI 的連接池

以下是一些現成的實現:

正如其他人所提到的,您可能需要考慮許多預構建的解決方案。

但是,如果您想要最簡單的自定義池實現,您可以使用一些合理大小的圓形數組,例如 100。然后只需使用SQLite對象填充它,並在它前面放置一些仲裁器,將查詢交給大批。 就像是:

public ResultSet runQuery(String sql) {
    SQLite connection = null;

    synchronized(this) {
        connection = connectionArray[currentIndex];
        currentIndex++;
        if (currentIndex >= connectionArray.length) {
            currentIndex = 0;
        }
    }

    return connection.query(sql);
}

然而,實際上,在應用程序實際需要那么多連接之前,分配和打開 100 個連接幾乎沒有意義。 As such, you would probably want to, at a minimum, add an isBusy() method to your SQLite class, and implement your arbiter class such that it searches for the first SQLite that is not bust and uses that one, allocating a new one僅當所有現有實例都忙時(並且僅當陣列中仍有空間用於新實例時)。

您可能還希望您的SQLite class 驗證連接在query()中是否仍然打開,因為如果連接空閑時間過長,大多數數據庫將關閉連接。 這是至少偶爾會在您的連接池中發生的事情。

直接使用 JDBC 並創建自己的連接池已不再流行!

我強烈建議查看 ORM 實現,例如 Hibernate。 然后,您可以將 C3P0 插入其中,以提供連接池。

這些問題已經解決,不再需要解決。 編寫自己的連接池將很難正確且難以測試。 除非你有強烈的理由自己編寫,否則我強烈推薦 Hibernate 和 C3P0。

暫無
暫無

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

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