目标
-
使用C3P0创建数据源DataSource。
-
使用DBCP创建据源DataSource。
-
能够使用JDBC简化工具包DBUtils完成单表的增删改查操作。
一,使用连接池重写工具类
1.为什么使用连接池重写工具类
-
1.因为每次创建和销毁连接都会消耗较多的系统资源
-
2.每次创建和销毁连接都要消耗大概0.05~1s的时间。
-
3.可以防止大量用户并发访问数据库服务器。
-
Connection对象在JDBC使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了.每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.程序初始化的时候,初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.
2.连接池原理
-
目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能。
3.编写连接池
3.1步骤
-
创建一个类,定义LinkedList集合作为连接池,在静态代码块中,向集合里面添加5个连接对象
-
添加addBack()方法,用作归还连接
-
代码:
public class MyDataSource {
//连接池
static LinkedList<Connection> pool = new LinkedList<>();
//初始化连接
static{
try {
for(int i = 0; i < 5; i++){
pool.add(JdbcUtils.getConnection());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//定义一个方法,从连接池中获取connection,从头部获取
public Connection getConnectionFromPool(){
if (pool.size() > 0) {
//池子中有connection
return pool.removeFirst();
}else {
//如果池子中没有connection,则先加入等待队列,等待队列满了的话就新建connection(新建的 //connection是不需要放回池子的,用完后直接销毁)
return JDBCUtil.getConnection();
}
}
//定义一个方法,将connection放回池子中(如果是新创建的connection则直接销毁)
public void addBack(Connection connection){
//pool.addLast(connection);//免不了会将新建的connection添加进池子;
try {
//写一个自己的connection,然后重写close()方法,通过close()方法来添加进池子。
connection.close();//免不了会将池子中的connection销毁
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//返回pool里面连接的个数
public int getCount(){
return pool.size();
}
}
3.2 编写连接池遇到的问题
-
如果新建了connection,用完之后怎么判别是原池子中的connection(需要放回去),还是新建的connection(需要销毁)。
3.3解决办法(自定义一个 Connection,重写close方法)
-
继承 条件:可以控制父类的构造
-
装饰者模式
目的:改写已存在的类的某个方法或某些方法,装饰设计模式(包装模式)
条件:1.包装类和被包装类实现同一个接口 2.包装类里面要拿到被包装类的引用
步骤:
-
编写一个类实现一个接口,为被包装类
-
编写一个类,实现与被包装类相同的接口。(具备相同的行为)
-
定义一个被包装类类型的变量。
-
定义构造方法,把被包装类类的对象注入,给被包装类变量赋值。
-
对于不需要改写的方法,调用被包装类类原有的方法。
-
对于需要重写的方法,写自己的代码。
-
动态代理(类似装饰者模式,此处不学)
3.4datasource接口概述
-
Java为