数据库连接池
1.DataSource接口
2.DBCP数据源
3.C3P0数据源
DBUtils工具
1 DBUtils工具介绍
2 QueryRunner类
3 ResultSetHandler接口
数据库连接池
在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,JAVA程序则要把代表连接java.sql.Connection对象加载到内存中,所以建立数据连接的开销很大,尤其是在大量的并发访问时。为了避免频繁地创建数据库连接,数据库连接池技术应运而生。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是重新建立
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,当应用程序访问数据库时并不是直接创建Connection,而是向连接池申请一个Connection。如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。使用完毕后,连接池会将该Connection回收,并交付其他的线程使用,以减少创建和断开数据库连接的次数,提高数据库的访问效率
DataSource接口
为了获取数据库连接对象,JDBC提供了javax.sql.DataSource接口,它负责与数据库建立连接,并定义了返回值为Connection对象的方法,具体如下:
1.Connection getConnection()
2.Connection getConnection(String username,String password)
接口通常都会有其实现类,javax.sql.DataSource接口也不例外,通常习惯性地把实现了javax.sql.DataSource接口的类称为数据源,顾名思义,数据源即数据的来源。在数据源中存储了所有建立数据库的连接信息。就像通过指定文件名称可以在文件系统中找到文件一样,也可以找到相应的数据库连接。
DBCP数据源
DBCP:是数据库连接池的简称,是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-dbcp.jar包中的很多方法就没有办法实现
DBUtils工具介绍
为了更加简单地使用JDBC,Apache组织提供了一个DBUtils工具,它是操作数据库的一个组件,实现了对JDBC的简单封装,可以在不影响性能的情况下极大地简化JDBC的编码工作量
QueryRunner类
QueryRunner类简化了执行SQL语句的代码,它与ResultSetHandler组合在一起就能完成大部分的数据库操作,大大地减少了编码量
QueryRunner类提供了带有一个参数的构造方法,该方法以javax.sql.DataSource作为参数传递到QueryRunner的构造方法中来获取Connection对象。针对不同的数据库操作,QueryRunner类提供了几种常见的方法,具体如下:
(1)query(String sql,ResultSetHandler rsh,Object…params)方法
该方法用于执行查询操作,它可以从提供给构造方法的数据源DataSource或使用的setDataSource()方法中获得连接
(2)update(String sql,object…params)方法
该方法用于执行插入,更新或者删除操作,其中,参数params表示SQL语句中的置换参数
(3)update(String sql)方法
该方法用来执行插入,更新或者删除操作,它不需要置换参数
ResultSetHandler接口
ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。根据结果集中数据类型的不同,ResultSetHandler提供了几种常见的实现类型,具体如下:
(1)BeanHandler:将结果集中的第1行数据封装到一个对应的JavaBean实例中
(2)BeanListHandler:将结果集中的每一行数据都封装到一个对象的JavaBean实例中,并放到List里
(3)ScalarHandler:将结果集中某一条记录的其中某一列的数据存储成Object对象
(4)handle(java.sql.ResultSet rs):如果实现类没有提供想要的功能,可以通过自定义实现ResultSetHandler接口的类,然后通过重写handle()方法,实现结果集的处理