簡體   English   中英

Java中的連接池允許通過JDBC URL進行連接?

[英]Connection pool in java which allows to get connection by jdbc url?

我試圖找到允許通過jdbc url獲得連接的連接池,但失敗了。 Hikari連接池不允許這樣做,與c3po中的情況相同。 我的用例是:

ConnectionPool.getConnection(jdbcUrl);

有人知道Java世界中的這種連接池嗎?

Java連接池簡單指南

作者-Baeldung

關於作者

一個簡單的實現

為了更好地理解連接池的基本邏輯,讓我們創建一個簡單的實現。

讓我們從一個僅基於單個接口的松耦合設計開始:

public interface ConnectionPool {
    Connection getConnection();
    boolean releaseConnection(Connection connection);
    String getUrl();
    String getUser();
    String getPassword();
}

ConnectionPool接口定義基本連接池的公共API。

現在,讓我們創建一個實現,該實現提供一些基本功能,包括獲取和釋放池連接:

public class BasicConnectionPool 
  implements ConnectionPool {

    private String url;
    private String user;
    private String password;
    private List<Connection> connectionPool;
    private List<Connection> usedConnections = new ArrayList<>();
    private static int INITIAL_POOL_SIZE = 10;

    public static BasicConnectionPool create(
      String url, String user, 
      String password) throws SQLException {

        List<Connection> pool = new ArrayList<>(INITIAL_POOL_SIZE);
        for (int i = 0; i < INITIAL_POOL_SIZE; i++) {
            pool.add(createConnection(url, user, password));
        }
        return new BasicConnectionPool(url, user, password, pool);
    }

    // standard constructors

    @Override
    public Connection getConnection() {
        Connection connection = connectionPool
          .remove(connectionPool.size() - 1);
        usedConnections.add(connection);
        return connection;
    }

    @Override
    public boolean releaseConnection(Connection connection) {
        connectionPool.add(connection);
        return usedConnections.remove(connection);
    }

    private static Connection createConnection(
      String url, String user, String password) 
      throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

    public int getSize() {
        return connectionPool.size() + usedConnections.size();
    }

    // standard getters
}

連接池是一種眾所周知的數據訪問模式,其主要目的是減少執行數據庫連接和讀/寫數據庫操作所涉及的開銷。

簡而言之,連接池是最基本的數據庫連接緩存實現,可以將其配置為適合特定要求。

在本教程中,我們將快速概述一些流行的連接池框架,並且將學習如何從頭開始實現我們自己的連接池。

為什么要建立連接池?

當然,這個問題是修辭。

如果我們分析典型數據庫連接生命周期中涉及的步驟順序,我們將理解原因:

使用數據庫驅動程序打開與數據庫的連接打開用於讀取/寫入數據的TCP套接字通過套接字讀取/寫入數據關閉連接關閉套接字很明顯,數據庫連接是相當昂貴的操作,因此應減少在每種可能的使用情況下(在極端情況下,都應避免)。

這是連接池實現起作用的地方。

通過簡單地實現一個數據庫連接容器,使我們能夠重用許多現有連接,我們可以有效地節省執行大量昂貴的數據庫行程的成本,從而提高我們數據庫驅動的應用程序的整體性能。

JDBC連接池框架

從務實的角度來看,考慮到可用的“企業就緒”連接池框架的數量,從頭開始實施連接池是沒有意義的。

從說教的角度出發,這不是本文的目標。

即便如此,在我們學習如何實現基本連接池之前,讓我們首先展示一些流行的連接池框架。

Apache Commons DBCP

public class DBCPDataSource {

    private static BasicDataSource ds = new BasicDataSource();

    static {
        ds.setUrl("jdbc:h2:mem:test");
        ds.setUsername("user");
        ds.setPassword("password");
        ds.setMinIdle(5);
        ds.setMaxIdle(10);
        ds.setMaxOpenPreparedStatements(100);
    }

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    private DBCPDataSource(){ }
}

在這種情況下,我們使用了帶有靜態塊的包裝器類來輕松配置DBCP的屬性。

以下是使用DBCPDataSource類獲得池化連接的方法:

connection con = DBCPDataSource.getConnection();

HikariCP

public class HikariCPDataSource {

    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
        config.setJdbcUrl("jdbc:h2:mem:test");
        config.setUsername("user");
        config.setPassword("password");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        ds = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    private HikariCPDataSource(){}
}

同樣,以下是與HikariCPDataSource類獲得池化連接的方法:

Connection con = HikariCPDataSource.getConnection();

暫無
暫無

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

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