Java的JDBC编程中,数据库的连接和关闭是十分耗费资源的。当对数据库的访问不是很频繁时,可以在每次访问数据库时建立一个连接,用完之后关闭。但是,对于一个复杂的数据库应用,频繁的建立、关闭连接,会极大的减低系统性能,造成瓶颈。所以可以使用数据库连接池来达到连接资源的共享,使得对于数据库的连接可以使高效、安全的复用。
MyDataSource 实现数据库连接池
通过自定义数据库了连接MyConnection(包裹了真正的Connection),使用一个LinkedList存放MyConnection,当一个数据库连接使用完成后,重新添加到LinkedList中,实现连接的复用。数据库连接池初始化时,构造多个数据库连接,虽然此时比较耗时,但是能够实现连接池的复用,提高效率。
package com.jdbc.datasource;
import java.sql.*;
import java.util.LinkedList;
/**
* 数据库连接池
* 自定义实现数据源
*
*/
public class MyDataSource {
private static final String URL = "jdbc:postgresql://localhost:5432/db";
private static final String USER = "postgres";
private static final String PASSWORD = "root";
private static final int INI_COUNT = 5; // 初始连接数
private static final int MAX_COUNT = 10; // 最大连接数
public int curCount= 0; // 当前连接数
// add remove频繁,LinkedList 效率由于 ArrayList
LinkedList<Connection> connsPool = new LinkedList<Connection>();
/**
* 初始构造多个数据库连接
*/
public MyDataSource() {
try {
for (int i = 0; i < INI_COUNT; i++) {
this.connsPool.add(this.createConnection());
curCount++;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 创建连接
* @return
* @throws SQLException
*/
public Connection createConnection() throws SQLException {
Connection realConn = DriverManager.getConnection(URL, USER, PASSWORD);
// MyConnection conn = new MyConnection(this, realConn);
/*** Connection 的代理类,绑定真正的Connection,拦截 close()方法 ***/
MyConnectionHandler pHandler = new MyConnectionHandler(this);
return pHandler.bind(realConn);
}
/**
* 释放
* @param conn 数据库连接
*/
public