【Java Web】数据库连接池与DBUtils工具

15 篇文章 0 订阅
2 篇文章 0 订阅

一、什么是数据库连接池

在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java程序则要把代表连接的java.sql.Connection对象等加载到内存中,所以建立数据库连接的开销很大,尤其是在大量的并发访问时。假如某网站一天的访问量是10万,那么,该网站的服务器就需要创建、断开连接10万次,频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。
为了避免频繁地建数据库连接,数据库连接池技术应运而生。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是重新建立。接下来,通过一张图来简单描述应用程序如何通过连接池连接数据库,如下图所示:
在这里插入图片描述
可以看出,数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,当应用程序访问数据库时并不是直接创建Connection, 而是向连接池“申请”一个Connection。如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。使用完毕后,连接池会将该Connection回收,并交付其他的线程使用,以减少创建和断开数据库连接的次数,提高数据库的访问效率。
DataSource 接口
为了获取数据库连接对象( Connection), JDBC提供了javax.sql.DataSource 接口,它负责与数据库建立连接,并定义了返回值为Connection对象的方法。
DBCP数据源
DBCP是数据库连接池( DataBase Connection Pool )的简称,是Apache组织下的开源连
接池实现,也是Tomcat服务器使用的连接池组件。单独使用DBCP数据源时,需要在应用程序
中导入两个JAR包,具体如下:
1.commons-dbcp.jar 包
commons-dbcp.jar包是DBCP数据源的实现包,包含所有操作数据库连接信息和数据库
连接池初始化信息的方法,并实现了DataSource接口的getConnection()方法。
2. commons-pool.jar 包
commons- pool.jar包是DBCP数据库连接池实现包的依赖包,为commons -dbcp.jar包中的方法提供了支持。可以这么说,没有该依赖包,commons- dbep.jar包中的很多方法就没有办法实现。

1.1DBCP数据源对象创建两种方法

使用BasicDataSoure类创建一个数据源对象,需要手动给数据源对象设置属性值,然后获取数据库连接对象,在Eclipse 中创建一个名称为chapter10 的Web项目,在项目chapter10 中导入mysql-connector-java- 5.0.8-bin.jar、commons-dbcp-1 .4.jar以及commons-pool-1.6.jar 3个JAR包,并发布到类路径下,然后在项目的src目录下创建包cn.itcast.chapter10.example,并在该包下创建一个Example01 类,该类采用手动方式获取数据库的连接信息和数据源的初始化信息。
在这里插入图片描述
通过读取配置文件创建数据源对象,除了使用BasicDataSource直接创建数据源对象外,还可以使用BasicDataSourceFactory工厂类读取配置文件,创建数据源对象,然后获取数据库连接对象。接下来,通过一个案例来演示,具体步骤如下。
在chapter10项目的src目录下创dbcpconfig.properties文件,该文件用于设置数据库的连接信息和数据源的初始化信息,如下:
在这里插入图片描述
在cn.itcast.chapter10的example包下创建一个Example2类,该类中采用了从配置文件中获取数据库的连接信息和数据源的初始化信息的方式:
在这里插入图片描述

1.2C3P0数据源

C3PO是目前最流行的开源数据库连接池之一,它实现了DataSource 数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和Spring都支持该数据源。在使用C3PO数据源开发时,需要了解C3PO中DataSource接口的实现类ComboPooledDataSource,它是C3P0的核心类,提供了数据源对象的相关方法 。
1.通过ComboPooledDataSource()构造方法创建数据源对象
使用ComboPooledDataSource()构造方法创建数据源对象,需要手动给数据源对象设置属性值,然后获取数据库连接对象,具体步骤如下:
在项目chapter10中导入JAR包c3p0- 0.9.1.2.jar, 然后在cn.itcast.chapter10.example包下创建一个Example03类,该类采用C3P0数据源手动代码的方式获取Connection对象,如下:
在这里插入图片描述
2.通过读取配置文件创建数据源对象
使用ComboPooledDataSource ( String configName )构造方法读取c3p0-config.xml 配置文件,从而创建数据源对象,然后获取数据库连接对象。下面通过一个案例来演示读取配置文件创建数据源对象的使用,具体步骤如下。
在src根目录下创建一个c3p0-config xml文件,用于设置数据库的连接信息和数据源的初始化信息:
在这里插入图片描述
在cn.itcast.chapter10.example包下创建一个Example04类,该类中使用C3P0数据源从配置文件中获取Connection对象:
在这里插入图片描述

二、DBUtils工具

2.1DBUtils工具介绍

为了更加简单地使用JDBC, Apache组织提供了个DBUtis 工具,它是提作数据库的一 一个组件,实现了对JDBC的简单封装,可以在不影响性能的情况下极大地简化JDBC的编码工作量。DBUtis工具可以在“tp:.mmo.h apache orpromons-oduisindex htm”"下载到,截止到目前它的最新版本为Apache Commons DbUtils 1.6.

2.2QueryRunner 类

QuerRunner类简化了执行SQL语句的代码,它与ResultHerdler组合在一起就能完成大部分的数据库操作,大大地减少了编码量。
QueryRunner类提供了带有一个参数的构造方法,该方法以javax.sal.DataSource作为参数传递到QueryRunner的构造方法中来获取Connection 对象。

2.3 ResultSetHandler 接口

ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。根据结果集中数据类型的不同,ResultSetHandler 提供了几种常见的实现类,具体如下:
BeanHandler:将结果集中的第1行数据封装到一个对应的JavaBean实例中。
BeanL istHandler:将结果集中的每一行数 据都封装到一个对应的JavaBean实例中,并存放到List里。
ScalarHandler:将结果集中某一条记录的其中某一列的数据存储成Object对象。另外,在ResultSetHandler接口中,提供了-个单独的方法handle
(java.sql.ResultSet rs),如果上述实现类没有提供想要的功能,可以通过自定义-一个实现ResultSetHandler接口的类,然后通过重写handle()方法,实现结果集的处理。

2.4 ResultSetHandler 实现类

在介绍了ResultSetHandler 接口中常见实现类的作用后。接下来,通过案例的形式,针对常见实现类的使用进行详细的讲解。
BeanHandler和BeanListHandler
BeanHandler和BeanlistHandler实现类是将结果集中的数据封装到对应的JavaBean实例中,这也是实际开发中最常用的结果集处理方法。接下来,通过代码实现来学习如何使用BeanHandler和BeanListHandler以及两者的区别。具体步骤如下:
(1)在名为jdbc的数据库中创建数据表user,创建语句如下:
在这里插入图片描述
向user表插入数据,查看数据是否添加成功。
(2)将下载好的包复制到lib目录下:
在这里插入图片描述
(3)创建BaseDao的类
在这里插入图片描述
(4)在此包下创建User实体类,来封装User对象
在这里插入图片描述
(5)在此包中创建类来 演示BeanHandle类对结果集的处理
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值