小总结:数据库连接池版,事务版,封装DaoUtils版,Apache的DBUtils版

 

一、数据库连接池构建方法

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类

         它就是一个工具类,定义了关闭资源与事务处理的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值