建议视频-----王勇jdbc里面有详细的解释
本人理解:一下创建多个相关对象,使用的时候,直接拿一个过来用。而不是,用一次,创建一个。就像你去商店买东西,一次买一些东西回来。而不是,一次买一种东西拿回来,再接着买。这样的好处,当然是减少了时间空间的开销。
package day3.cn.itcast.jdbc.datasource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
public class MyDataSource {
private static String url = "jdbc:mysql://localhost:3306/jdbc";
private static String user = "root";
private static String password = "";
/* 每个数据的connection的个数都是有限的,所以说数据库连接资源是非常宝贵的,使用完了之后就最好关闭掉。(客户端占用的资源释放掉)但是数据库连接都是非常耗时的。所以要建立数据库连接池。 数据库连接池:在服务器端运行时,创建多个数据库连接,将这些数据库连接存放到一个LinkedList集合中。每次客户端使用时,从集合中remove首连接,知道客户端使用完连接之后,又将remove的首连接添加到集合的末尾。这样就可以保证连接池中的连接是可以重复利用的。
*/
/* 为了防止数据库连接无限制的创建,在这里添加了initCount等变量,当当前连接数currentCount超过
maxCount,获取连接时就会报出异常。
*/
private static int initCount = 5;
private static int maxCount = 10;
private int currentCount = 0;
LinkedList<Connection> connectionsPool = new LinkedList<Connection>();
public MyDataSource() {
try {
for (int i = 0; i < initCount; i++) {
this.connectionsPool.addLast(this.createConnection());
this.currentCount++;
}
} catch (SQLException e) {
throw new ExceptionInInitializerError(e);
}
}
public Connection getConnection() throws SQLException {
//为了防止并发情况的发生,这儿添加了同步代码块。防止两个人同时到达获取同一个连接。
synchronized (connectionsPool) {
//当前连接池中还有连接,就返回连接池中的连接
if (this.connectionsPool.size() > 0)
return this.connectionsPool.removeFirst();
//当前连接数没有超过maxCount就应该创建连接
if (this.currentCount < maxCount) {
this.currentCount++;
return this.createConnection();
}
//如果连接数超过maxCount,就会报出异常
throw new SQLException("已没有链接");
}
}
public void free(Connection conn) {
this.connectionsPool.addLast(conn);
}
private Connection createConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
}
|