一、什么是数据库连接池
可以简单的理解为存放数据库连接对象的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象。当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
二、数据库连接池的好处
1、资源重用 (连接复用)
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,增进了系统环境的平稳性(减少内存碎片以及数据库临时进程、线程的数量)
2、更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池内备用。此时连接池的初始化操作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3、新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接技术。
4、统一的连接管理,避免数据库连接泄露
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用的连接,从而避免了常规数据库连接操作中可能出现的资源泄露
三、数据库连接池的实现
(一)实现
所有的数据库连接池都需要实现javax.sql包下的DataSource接口。
有很多的数据库厂商和开源组织都提供了实现数据库连接池的技术
(二)数据库连接池技术
目前一共使用过两种连接技术,此处做一个小小的总结
1、C3P0数据源
2、Druid数据源
四、C3P0数据源
(一)使用步骤
1、导入jar包,该技术需要使用的jar包如下:
1 | c3p0-0.9.5.2.jar |
2、定义配置文件
该配置文件名称必须为c3p0.properties 或者 c3p0-config.xml;
并且需要放在src目录下,程序会自动加载该配置文件。
如,使用c3p0-config.xml来做配置文件则大致如下:
1 | <c3p0-config> |
其中<default-config>
是默认配置,<named-config name="XXX">
是自定义配置,一个配置文件中可以有一个或者多个自定义配置,调用ComboPoolDataSource(String configName)方法传入<named-config>
节点中name属性的值即可创建C3P0数据源对象。
补充:虽然也可以不用配置文件,而通过调用一些方法来设置,但是一般都不会这样做。
3、创建DataSource对象(连接池)
C3P0使用ComboPooledDataSource类来创建数据库连接池对象,直接创建实例对象即可。
1 | DataSource ds = new ComboPooledDataSource(); |
4、获取Connection对象
1 | Connection conn = ds.getConnection(); |
5、归还Connection连接
在使用完后,我们需要将Connection对象归还给连接池。对此我们只需要调用close()方法即可。
1 | conn.close(); |
(二)入门小Demo
Demo1:
1 | public class C3P0Demo1 { |
Demo2:
1 | public class C3P0Demo2 { |
五、Druid数据源
Druid是阿里巴巴开源的一个数据源,主要用于java数据库连接池,相比spring推荐的DBCP和hibernate推荐的C3P0、Proxool数据库连接池,Druid在市场上占有绝对的优势;
(一)使用步骤
1、导入jar包
1 | druid-1.0.9.jar |
2、定义配置文件
其配置文件是properties形式的,可以叫任意名称,可以放在任意目录下(一般放在src目录下,通过ClassLoader来进行加载),因为和C3P0相比,不会自动加载,需要我们手动进行加载。
配置文件大致如下,如:druid.properties
1 | driverClassName=com.mysql.cj.jdbc.Driver |
3、加载配置文件
1 | Properties pro = new Properties(); |
4、获取数据库连接池对象
和C3P0相比,该技术的数据库连接池对象需要通过DruidDataSourceFactory工厂类来获取,如下:
1 | DataSource pool = DruidDataSourceFactory.createDataSource(参数); |
5、获取连接
1 | Connection conn = pool.getConnection(); |
6、归还Connection连接
在使用完后,我们需要将Connection对象归还给连接池。对此我们只需要调用close()方法即可。
1 | conn.close(); |
(二)入门小Demo
1 | public class DruidDemo { |
以上的3个小demo中,为了方便,没有加入归还Connection对象的代码。在实际应用中,只需要调用其close()即可。
Java新手,若有错误,欢迎指正!