一、数据库连接池构建方法
1、利用Apache的Commons Pool通过继承BasePooledObjectFactory类实现一个PoolableConnectionFactory类,实现将JDBC数据库连接Connection对象包裹为一个PooledObject,并通过create()方法实现创建Connection对象,利用重载passivateObject、destroyObject等方法来控制Connection对象在从连接池取出、到返回连接池、再到最终被销毁的整个生命周期的一些细节。
通过继承GenericObjectPool类实现一个ConnectionPool类,构造函数中的工厂类参数指向上述所构建的PoolableConnectionFactory对象。
提供一个单例模式的管理类ConnectionPoolManager,使得获取到的连接池对象唯一。
二、通用方法的封装方式
(1)为了使最终利用该框架进行MySQL数据库开发的开发者在使用该框架时,只需通过简洁配置后,便可透明地使用数据库连接池和结果集缓存特性,需要对JDBC相关方法进行进一步封装,封装采用类装饰器的模式的方式,如建立PoolableConnection类,在构造函数中从连接池中取得一个Connection对象。
(2)其他主要的方法与Connection类保持一致,这样可以保证对开发者透明。
(3)另外,重点关注点是需要进行装饰的方法,如close()方法,当使用该方法时并不是要关闭Connection对象,而是需要将其返回到连接池中。
2、(1)为了实现结果集缓存,需要按上述封装思路,进一步构建如PoolableStatement和PoolablePreparedStatement类,以PoolableStatement类举例,PoolableStatement对象由PoolableConnection类中的createStatement方法产生,但实际的Statement对象是在PoolableStatement类的构造函数中由真正的Connection对象产生的。
(2)同样重点关注需要进行装饰的方法,如executeQuery(String sql)方法,当使用该方法时需要先通过sql参数生成key,利用key搜索缓存中是否已经缓存了对应的查询结果集,如果存在,就不需要对数据库进行物理查询,只需要从缓存中返回该结果集;如果不存,再进行物理查询,并对返回结果集创建新的缓存。
(3)以此类推,实现execute相关的各类方法,另外需要特别说明的一点是在进行非查询SQL时,当涉及的表格存在于缓存中时,需要锁住缓存,并刷新结果集,刷新策略可以采用立即方式或惰性方式。
三、数据库连接池原理
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完后再放回去。通过设定连接池最大连接数来防止系统无尽的与数据库连接。通过连接池的管理机制监控数据库的连接的数量,使用情况,为系统开发,测试及性能调整提供依据。
数据库连接池远不止这4步,需要考虑的问题很多,这里只是简单说明其原理:
1.新建一个类实现DataSource接口
2.在构造器中一次性创建5个连接,将连接保存到LinkedList中
3.从LinkedList中返回一个连接
4.将连接放回连接池中
四、JDBC数据库事务
1.数据库事务介绍
(1)事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
(2)事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
(3)为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。
2.JDBC事务处理
数据一旦提交,就不可回滚。
3.数据什么时候意味着提交?
(1)当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
(2)关闭数据库连接,数据就会自动的提交。如果多个操作,每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。
4.JDBC程序中为了让多个 SQL 语句作为一个事务执行:
(1)调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务
(2)在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
(3)在出现异常时,调用 rollback(); 方法回滚事务
若此时 Connection 没有被关闭,还可能被重复使用,则需要恢复其自动提交状态
setAutoCommit(true)。尤其是在使用数据库连接池技术时,执行close()方法前,建议恢复自动提交状态。
五、apache的DBUtils版
1.什么是dbutils,它的作用?
(1)DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
(2)DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。
(3)对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;
(4)对于数据表的写操作,也变得很简单(只需写sql语句)
(5)可以使用数据源,使用JNDI,数据库连接池等技术来优化性能–重用已经构建好的数据库连接对象
2.DBUtils的三个核心对象
(1)QueryRunner中提供对sql语句操作的API.它主要有三个方法:
query() 用于执行select
update() 用于执行insert update delete
batch() 批处理
(2)ResultSetHandler接口
用于定义select操作后,怎样封装结果集.
(3)DbUtils类
它就是一个工具类,定义了关闭资源与事务处理的方法