1. 数据库连接池的概念
1.背景:
(1) 当前项目较为简单,对于数据库访问并不是很频繁,所以在访问数据库时可以新创建一个连接对象,使用完毕之后关闭连接对象,性能上的开销很小
(2) 但是对于复杂的数据库,频繁的建立,关闭连接,性能上的开销很大,会极大的降低系统的性能,对连接的使用很可能造成系统性能的瓶颈。
2. 解决这种情况的方案:
在程序启动的时候创建出指定数量的连接保存到池(容器)里面,在要使用连接的时候从池中取出,使用完毕之后回收到池中
3.使用连接池的好处:
(1)不用频繁创建连接
(2)连接池自己管理连接
(3)连接可以重复使用
4. 连接池方案:
(1)dbcp
(2)c3p0,和Spring整合使用
(3)阿里巴巴的Druid连接池(高性能),可以和Spring整合使用,可以实现性能的检测(比如实现慢查询的检测)
2. 使用Druid连接池
2.1 在项目中导入jar包
2.2 定义连接池工具类
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
public class ConnectionPoolUtil {
//实例化数据源管理对象
private static DruidDataSource dataSource = new DruidDataSource();
static{
//设置连接地址
dataSource.setUrl("jdbc:mysql://localhost:3306/demo?useSSL=true&useUnicode=true&characterEncodinng=UTF-8");
//设置用户名
dataSource.setUsername("root");
//设置用户密码
dataSource.setPassword("xxxxxxxx");
//设置驱动名称
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//设置初始化连接数
dataSource.setInitialSize(10);
//设置连接数量的上限
dataSource.setMaxActive(20);
//设置最大等待时间为3秒
dataSource.setMaxWait(3000);
//设置池中最小连接数量
dataSource.setMinIdle(5);
}
/**
* 从连接池中获取连接对象
* @return
*/
public static Connection getConnection(){
try{
return dataSource.getConnection();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 关闭连接
* @param conn
*/
public static void close(Connection conn){
try{
if(conn!=null&&!conn.isClosed()){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
2.3 使用连接池
在service层实现类中
-------------------
//取得Connection对象
Connection conn = ConnectionPoolUtil.getConnection();
//取得dao层的实现类对象
private IDAO<Dept> deptDAO = new IDeptDAOImpl(conn);