13.数据库连接池
/*使用数据库连接池优化程序性能*/
一次性从数据库中拿出一定数量的连接,放到一个池子中,每次程序要拿连接的时候,从这个池子里面去拿,用完了,也是放到这个池子里,
避免频繁的从数据库中去存取连接
编写自己的数据库连接池
1.实现DataSource接口 ,DataSource接口中定义了两个重载的getConnection() 方法
2.在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中
实现getConnection()方法,让getConnection()方法每次调用时,从LinkedList中取一个connection (remove方法) 返回给用户
3.当用户使用完connection,调用connection.close() 方法时,connection对象应保证自己返回到LinkedList中,而不要把connection 还给数据库
针对 “返回到LinkedList中,而不要把connection 还给数据库” 这种需要增强某个方法,有三种方式实现
1.编写一个子类(继承Connection) 覆盖close方法 (这里不可以,因为父类的其他信息,子类并不拥有)
2.写一个Connection包装类,增强close方法 (包装设计模式)
3.用动态代理,返回一个代理对象出去,拦截close方法的调用,对close方法进行增强
(不是clsoe方法,都调用invoke方法(让其调用connection自身的方法),是close方法的话,手动增强)
/*用包装设计模式对某个对象进行增强*/
1.写一个类,实现与被增强对象(mysql的connection)接口
2.定义一个变量,指向被增强对象
3.定义一个构造方法,接收被增强对象
4.覆盖想增强的方法
5.对于不想增强的方法,直接调用被增强对象的方法
/*加入dbcp链接池*/
1.导入jar包
2.在类目录下加入dbcp的配置文件
3.在jdbcUtils静态代码块中创建池
/*C3P0数据库连接池*/
1.导入jar包
2.新建c3p0Test.java单元测试类
3.打开c3p0的doc帮助文档
4.选择QuickStart快速开始
5.拷贝里边的实例代码
6.修改各个参数
采用配置文件配置数据源
1.打开帮助文档
2.找到XML文件示例
3.在工程中新建c3p0-config.xml文件
4.拷贝XML示例文件,修改参数 ( <property></property> )
private static ComboPooledDataSource ds = null;
static {
try {
ds = new ComboPooledDataSource("...");(如果括号为空,没有指定的话,则采用默认)
}
}
/*配置Tomcat数据源(实际上是DBCP)*/
1.在Tomcat中加入数据库驱动软件(放在web工程中的lib 中没有用,需要放在Tomcat的lib目录下)
2.配置context(可以在很多地方,可以修改tomcat的service.xml文件,也可以在web工程中)
META-INF目录下,新建一个XML文件,拷贝Tomcat帮助文档中的示例代码
3.使用JNDI获取连接对象
Context initCtx = new InitialContext(); //初始化JNDI
Context envCtx = (Context) initCtx.lookup("java:comp/env"); //得到JNDI容器
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); //从容器中检索连接池
Connection conn = ds.getConnection();