数据库连接背景
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。这项技术能明显提高对数据库操作的性能。
数据库连接池的原理
没有使用数据库连接池:一个访问创建一个连接,使用完关闭连接。而频繁的创建和关闭连接非常耗时

使用数据库连接池之后:提前准备一些数据库连接,使用时从池中取出,用完归还连接池
配置文件 config.properties
JDBCUtils工具类
定义一个连接池类并实现<code>java.sql.DataSource</code> 接口。
输出:
问题:虽然我们自定义了数据库连接池,但是连接关闭以后并没有归还给数据库连接池,还需要改进<code>归还连接</code>的问题
通过输出<code>Connection</code>的地址发现<code>Connection</code>类的实现类是<code>JDBC4Connection</code>,是否能够通过编写一个类继承<code>JDBC4Connection</code>,然后重写<code>close()</code>方法,在关闭连接的同时归还连接?
但是这种方式行不通,通过查看JDBC工具类获取连接的方法我们发现:我们虽然自定义了一个子类,完成了归还连接的操作。但是<code>DriverManager</code>获取的还是<code>JDBC4Connection</code>这个对象,并不是我们的子类对象。而我们又不能整体去修改驱动包中类的功能!
自定义Connection类。通过装饰设计模式,实现和mysql驱动包中的Connection实现类相同的功能!
实现步骤:
定义一个类,实现Connection接口
定义Connection连接对象和连接池容器对象的变量
提供有参构造方法,接收连接对象和连接池对象,对变量赋值
在close()方法中,完成连接的归还
剩余方法,只需要调用mysql驱动包的连接对象完成即可
自定义连接池类
缺点:<code>Connection</code> 接口中要实现的方法太多了,代码繁杂
提供一个适配器类,实现<code>Connection</code>接口,将所有功能进行实现(除了<code>close()</code>方法),作为中间类。自定义连接类只需要继承这个适配器类,重写需要改进的<code>close()</code>方法即可!
适配器类不需要实现<code>close()</code>方法,所以定义为抽象类
自定义连接类
通过适配器设计模式。完成close()方法的重写
定义一个类,继承适配器父类
定义<code>Connection</code>连接对象和连接池容器对象的变量
在<code>close()</code>方法中,完成连接的归还
缺点:自定义连接类中的方法已经很简洁了。剩余所有的方法已经抽取到了适配器类中。但是适配器这个类还是我们自己编写的,也比较麻烦!所以可以使用动态代理的方式来改进。
导入jar包
导入配置文件到src目录下
创建c3p0连接池对象
获取数据库连接进行使用
配置文件 <code>c3p0-config.xml</code> 注意该配置文件的名字是固定的不要改,否则无法识别
<code>initialPoolSize</code>:初始化连接数量
<code>maxPoolSize</code>:最大连接数量,当连接数量超过初始化连接数量时,会在连接池内继续创建连接,直到达到数据库连接池所能容纳的最大连接数量
<code>checkoutTimeout</code>:超过时间。如果使用的连接数量超过最大连接数量,编译器会在<code>checkoutTimeout</code>时间以后报错并终止程序。
C3P0数据库连接池的使用
编写配置文件,放在src目录下
通过Properties集合加载配置文件
通过Druid连接池工厂类获取数据库连接池对象
获取数据库连接,进行使用
配置文件<code>druid.properties</code>
Druid数据库的使用
工具类的使用