Advertisement

数据库连接池与DBUtils(第十章)

阅读量:

一、数据库连接池
1.1 什么是数据库连接池

在JDBC编程过程中,在每次对数据库进行操作时都需要创建一个连接对象,在完成操作后则需要释放该连接对象以避免资源泄漏(即释放对象)。例如:一个典型的应用场景是某个网站每天会有十万次用户的访问量,在这种情况下就需要对数据库执行十万次的操作(包括创建和释放连接对象),而频繁进行的创建与关闭操作会极大地降低数据库操作效率(导致数据库操作效率低下)。为此引入了数据库连接池技术:这是一种协调多线程环境下的资源管理机制。

  1. 应用程序不需要自行建立和关闭连接对象,并不是由应用程序直接进行管理。
  2. 当数据库连接池断开时,并非是删除或销毁相关对象;而是将这些关联的对象返还给原来的连接池。

数据库连接池基本参数:

1.初始化大小:数据库连接池里面初始的连接对象个数

2.最大连接数:数据库连接池里面最大的连接对象个数

  1. 最大延迟时间:当用户通过**[...]**获取资源时所需的最大延迟时间。
  2. 最高空闲容量:在数据库的访问趋于平稳时所拥有的最高空闲容量。
  3. 最低负载:当系统达到高峰负载时所拥有的最低负载状态。

优点:采用数据库连接池进行管理,从而降低了创建和销毁 databases connections object 的成本,显著提升了咱们 database 的整体访问效率.

1.2 DataSource接口:

数据库连接池技术: sun公司制定了相应的规范(即接口),使得各个数据库厂商能够遵循这一规范并完成各自的实现方案。
当前广泛使用的类型包括DBCP和C3p0。

1.3 DBCP数据源

Apache DBCP数据库连接池(Apache Database Connection Pool),由Apache组织开源提供了完全开源且免费使用的数据库连接池技术。

在项目中开发中,使用DBCP的基本步骤:

前提导入DBCP的jar包: commons - dbcp. jar , commons -pool.jar a

DBCP获取连接对象:设置连接参数。

四个连接参数:dr iverName,url, use rname, password.

DBCP获取连接对象具体的方式:

首先介绍如何通过手动创建BasicDataSource类实例来获取数据库连接对象。
在为数据源对象分配资源时,默认情况下会初始化一些必要的属性值。
以下将通过一个具体的示例来说明BasicDataSource类的用法。
(1)在Eclipse中新建一个名为chapter10的Web项目,并将上述三个JAR包(包括mysql-connector-java-5.0.8-bin.jar、commons-dbcp-1.4.jar以及commons-pool-1.6.jar)拖入项目的类路径中。
随后,在项目的src目录中新建包cn.itcast.chapter10.example,并在此包内定义example01.java文件。
(2)按照以下步骤完成配置:
第一步:启动Eclipse并新建Java工程。
第二步:在工程属性中指定所需的Java开发环境配置项。
第三步:编写并保存example01.java文件中的代码实现细节。
第四步:运行工程以验证配置效果。
如图所示:

(2)运行main()方法后,运行结果如下:

第二种:通过读取配置文件创建数据源对象,从而获取连接对象
(读取配置的好处:在不修改代码的情况,可以修改数据库的连接参数。)
除了使用BasicDataSource直接创建数据源对象外,还可以使用BasicDataSourceFactory工厂类读取配置文件,创建数据源对象,然后获取数据库连接对象。下面通过一个案例来演示,具体步骤如下。
(1)在chapter10项目的src目录下创建dbcpconfig.properties 文件,该文件用于设置数据库的连接信息和数据源的初始化信息。
(2)src目录下创建包cn.itcast.chapter10.example,并在该包下创建一个example02类,该类中采用了从配置文件中获取数据库的连接信息和数据源的初始化信息,具体如下:

1.4 C3PO数据源
当前主流的开源数据库连接池方案之一是C�PO(读作"See-SEE-poh"),它遵循了DataSource 数据源接口,并符合JDBC 2及JDBC 3的标准规范要求。由于具备良好的扩展性与优异的表现特性,在实践应用中也得到了广泛的采用与认可。例如像Hibernate与Spring这样的常见框架都可选配该数据源作为基础组件,在实际应用中也展现出良好的兼容性与易用性特点。
在实际应用中开发人员通常会关注comboPooledDataSource这一核心实现类的具体功能定位以及相关操作方法设计。

采用ComboPooledDataSource()构造方法来生成数据源对象,并且必须手动配置数据源属性参数以获取数据库连接对象的具体操作流程如下

请在第10章项目中添加JAR包c3p-v-.9-.1-.2.jar,并在此项目的cn.\itcast.\chapter 1-e-x-a-m-p-l-e包内生成一个example实例。该实例将通过C3Po数据源的手动编码实现来获取Connection对象。

(2)运行main()方法后,程序的运行结果如图:

通过使用ComboPooledDataSource ( String configName )构造方法来读取c3p0-config.xml 配置文件以创建数据源对象。这一过程将生成相应的数据源对象实例,并随后获得数据库连接对象。以下将通过一个实际案例详细说明如何利用该方法实现配置文件到数据源的转换过程。
具体操作步骤如下:

生成于src根目录下的一个c3p0-config XML文件旨在配置数据库连接参数及数据初始化流程。

com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/jdbc root root 30000 10 30 100 10 200 com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/jdbc root root 5 15 (2)在cn.itcast.chapter10.example包下创建一个Example04类,该类中使用C3P0数据源从配置文件中获取Connection对象。

(2)运行main()方法后,程序的运行结果如图:

为了更加简便地使用JDBC, Apache组织提供了一个DBUtils工具。
它作为数据库的一个组件。
实现了对JDBC的支持。
不会影响性能的情况下大大降低了编码复杂度。
DBUtis工具可以在‘tp:.mmo.h apache orpromons-oduisindex htm’下载到,
截止到目前它的最新版本为Apache Commons DbUtils 1.6。

QuerRunner类优化了对SQL语句的执行过程,并通过与ResultHerdler协同工作,则能够覆盖绝大多数数据库操作。同时该解决方案显著降低了所需的编码工作量。

QueryRunner类支持了一个带有单一参数的设计。该构造函数通过指定javax salv DataSource作为输入源来生成相应的Connection对象。

2.3 ResultSetHandler 接口
该接口专门用于处理ResultSets,并将这些ResultSets转换为不同的形式。基于ResultSets中所包含不同类型的数据,该接口提供了多种实现类以满足不同需求。
其中一种实现类是BeanHandler:它负责将ResultSet中的第一条数据封装成一个对应的JavaBean对象。

BeanListHandler: 负责将结果集中每一行数据分别封装为与之对应的JavaBean对象,并最终存储到列表中

ScalarHandler 负责将单条记录中的某一列数据存储为一个 Object 对象。此外,在 ResultSetHandler 接口中提供了单独的一个方法 handle( )。如果没有满足需求的功能,则可以自定义一个能够实现 ResultSetHandler 接口的类,并重写其 handle() 方法来完成对 ResultSet 的处理。

2.4 ResultSetHandler 包含实现类的功能
在2.3小节中已经阐述了该接口所涉及实现类的作用。下面将通过案例的方式详细讲解常见实现类的使用方法。

基于JavaBean的数据访问组件 BeanHandler 和 BeanListHandler 是一种用于将 ResultSet 中的数据封装到对应 JavaBeans 实例的方式。这种方法在实际开发中通常是处理结果集的标准方法。接下来我们将通过具体的代码实现来学习如何使用 BeanHandler 和 BeanListHandler 以及它们之间的区别。具体实现步骤如下:

(1)在名为jdbc的数据库中创建数据表user,创建语句如下:

创建表user

向user表插入3条数据,具体语句如下:

为了确认数据是否已被成功添加到user表中,请通过执行SELECT语句来检索user表中的记录。

首先,在chapter10项目的cn.itcast.chapter10.example包中放置下载的DBUtis工具的JAR文件commons- dbutils- 1.6.jar至lib文件夹中,并将第9章中的JDBCUtils.java文件移动至该包下的BaseDao目录内。随后,在该目录下构建一个名为BaseDao的新类,并在其内部实现一个通用查询方法的具体操作流程如下:

全部评论 (0)

还没有任何评论哟~