开始下一个知识点学习,数据库连接池。前面我们虽然使用了DBUtils.java这个工具类,处理没一个DAO中方法都是需要new connecttion对象,用完了然后关闭释放资源。有了连接池之后,可以大大提高数据库操作的性能。
1.什么是连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:
释放空闲时间超过最大空闲时间的数据库连接,来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项数据能明显提高对数据库操作的性能。
2.没有连接池的缺点
之前我们每次处理一个请求,都是调用DAO层下具体方法,每一个方法都是新建数据库连接,然后处理业务,然后关闭连接,整个过程就像下面这张图描述的样子。
得到
3.用了连接池的效果
为了解决2中的问题,采用数据库连接池的技术。
上面DAO到DB之间,我们提前创建了一个连接池,假如说10个,第一个用户对应的连接处理完了,不会立马关闭,而是放回到连接池中,让后面等待的数据库访问对象去接着使用创建好的连接对象。这样大大节约了连接对象的创立时间和对象关闭时间的消耗,提升了数据库的访问连接性能。
总结:连接池的作用
解决建立数据库连接耗费资源和时间很多的问题,提高数据库服务器
4.模拟创建一个连接池
下面我们利用前面UBUtils.java基础上模拟一个连接池。
package com.anthony.pool;
import java.sql.Connection;
import java.util.Collections;
import java.util.LinkedList;
import javax.management.RuntimeErrorException;
import com.anthony.utils.DBUtils;
//模拟数据库连接池,但不具备实际开发意义
public class SimplePool {
//创建一个存放连接的池子,大小为10
private static LinkedList<Connection> pool = (LinkedList<Connection>) Collections.synchronizedCollection(new LinkedList());
static {
try {
for (int i = 0; i < 10; i++) {
Connection conn = DBUtils.getConnection();
pool.add(conn);
}
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化数据库连接失败,请检查配置文件。");
}
}
//得到一个连接
public Connection getConnectionFromPool() {
Connection conn = null;
if(pool.size() > 0) {
conn = pool.removeFirst();
return conn;
}else {
// 1 等待
// 2.等待超时,新创建一个连接
throw new RuntimeException("服务器忙");
}
}
//释放一个连接
public void releaseConnection(Connection conn) {
pool.addLast(conn);
}
}
上面代码只是模拟,没有实际开发意义。