[英]Connection pool in java which allows to get connection by jdbc url?
我試圖找到允許通過jdbc url獲得連接的連接池,但失敗了。 Hikari連接池不允許這樣做,與c3po中的情況相同。 我的用例是:
ConnectionPool.getConnection(jdbcUrl);
有人知道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.