数据库笔记08 JDBC连接池
文章目录
一.连接池:
1.为什么要用连接池:
- 由于建立数据库连接非常耗时耗资源,所以通过连接池预先同数据库之间建立连接,放在内存中,应用程序需要建立数据的时候可以直接连接到连接池中申请一个就行,使用完毕后再归还到连接池中
- 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能
- 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等
2.市面上现成的连接池:
- apache出品DBCP连接池
- 一些非现成的连接池也非常好用,将在本节后续进行介绍
二.DBCP连接池:
DBCP连接池是由apache出品的连接池,现介绍其使用方法:
首先注意将DBCP两个jar包放入对应的lib中,右键添加依赖
使用方式
- 硬编码方式:
//创建对应的连接对象
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///mydb");
ds.setUsername("root");
ds.setPassword("123456");
//配置自主参数:如延时等
//获取连接的对象
Connection conn = ds.getConnection();
//获取操作对象
PreparedStatement preparedStatement = conn.prepareStatement("select * from emp");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String ename = resultSet.getString("ename");
System.out.println(ename);
}
//释放内存
conn.close();
resultSet.close();
ds.close();
- 配置文件方式:较硬编码方式更加灵活,适用性更高
//DBCP 配置文件的方式
Properties properties = new Properties();
properties.load(new FileInputStream("src/dbcp.properties"));
//创建数据连接
DataSource ds = new BasicDataSourceFactory().createDataSource(properties);
//获取连接的对象
Connection conn = ds.getConnection();
//获取操作对象
PreparedStatement preparedStatement = conn.prepareStatement("select * from emp");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String ename = resultSet.getString("ename");
System.out.println(ename);
}
//释放内存
conn.close();
resultSet.close();
三.C3P0连接池:
C3P0连接池对比DBCP连接池的好处就在于可以自动回收空闲的连接功能,同时在使用之前应注意在编译器中添加对应的依赖,选择介绍其使用方式:
- 硬编码形式
- 配置文件方式:其中对配置文件有要求如下:
1)位置(src目录下)和文件名
2)c3p0在读取配置文件时与之前几种不同,直接new数据连接之后获取连接对象即可,因为会自动读取配置文件
3)配置文件中使用对应的键值配置文件和xml形式的配置文件都可以进行识别
4)在new对象时不传参会读取默认配置文件,如果要读取第二配置,要传入对应的configname
四.DRUID连接池(最常用/功能最强大):
DRUID是阿里开源平台上一个数据库连接池的实现,结合了C3P0,DBCP等连接池的优点,同时加入了监控日志,可以很好的监控DB连接池和SQL执行情况,其使用方法同样也是两种方式:硬编码和配置文件模式,主要不同的是连接对象的类名是DruidPooledConnection
,跟前几个不同,前几个是Connection
,而在配置文件的连接池方法中方法与前几款均一致(不同于C3P0)
五.dbutils工具类可以简化增删改查:
我们在查询封装时需要自己新建一个类去封装查询到的数据,dbutils可以简化查询对象:
先建立数据连接对象之后使用:
QueryRunner queryRunner = new QueryRunner(); //建立操作对象
封装类 封装数据对象 = queryRunner.query(SQL语句,
new BeanHandler<封装类>(封装类.class),
参数[代替SQL语句中的"?"]);
//将数据查询并进行封装进对应类
上面的方式可以通过反射来封装:
List<封装类> list = queryRunner.query(SQL语句,new BeanListHandler<封装类>(封装类.class));
增删改对应的sql数据:将sql语句单独写出来一个string
int i = queryRunner.update(sql,参数); //增删改语法
上面的i接收的就是操作结果行,>0说明操作成功