自定义连接池,连接池的到的连接和通过参数获取的连接之间的差别
自定义连接池的特点:
1:初始时需要创建连接 Connnection con = DataSourse.getConnection();(如果直接调用这个方法的话
那么创建的连接在关闭的时候便会被销毁,所以还需要装饰者模式来增强这个con,)
2: 对外提供getConnection()这个方法。
3:当使用者调用那个close()这个方法时,不能销毁连接,只能把它归还给池对象。
===========
提到装饰者模式。来详细的说一下。
口诀:是你还有你,一切拜托你。
在java中类和类之间的关系有三种:
自定义连接池的特点:
1:初始时需要创建连接 Connnection con = DataSourse.getConnection();(如果直接调用这个方法的话
那么创建的连接在关闭的时候便会被销毁,所以还需要装饰者模式来增强这个con,)
2: 对外提供getConnection()这个方法。
3:当使用者调用那个close()这个方法时,不能销毁连接,只能把它归还给池对象。
===========
提到装饰者模式。来详细的说一下。
口诀:是你还有你,一切拜托你。
在java中类和类之间的关系有三种:
1:is ----> 是一个 class A extends B{}
2:has ----> 有一个 class A{private B b;}
3:use ----> 用一个 class A{public void eat(B b){}}
2:has ----> 有一个 class A{private B b;}
3:use ----> 用一个 class A{public void eat(B b){}}
通过装饰者模式对Connection进行包装:
(这个只是示意代码)
class Myconn impelments Connection{
private static Connection con;//创建底层对象
privare datic ItcastDateSourse dataSourse;//创建池对象
//创建Myconn对象时,需要传递底层对象
public Myconn(ItcastDataSourse dataSourse,Connection con){
this.con = con;
this.dataSourse = dataSourse;
}
public void close(){
return this.dataSouse.add(this)
}
class ItcastDataSourse {
private List<Myconn> connList = new ArrayList<Myconn>():
public ItcastDataSourse(){
//通过循环和四大参数要创建3个连接
String user = "root";
String password = "123456";
String DriverClass("com.mysql.jcbc.Driver");
String url = "jdbc:mysql://localhost:3306/student";
Class.forName(DriverClass);
//创建底层对象
Connection con = DriverManager.getConnection(user,url,password);
//创建包装对象
Myconn myconn = new Myconn(this,myconn);
//把包装对象添加到池中
connList.add(myconn);
}
//增强getconnection方法
public Connection getConnection(){
if(connList.size == 0){
throw new RuntimeException("别要了。连接没了,等一会!");
}
return connList.remove(0);//移除并且返回下标诶0 的连接
}
//增强close方法
public void add(Myconn mycon){
this.connList.add(mycon);
}
}
完整代码如下:
public class Myconn implements Connection {
private static Connection con ;//创建底层对象
//创建池对象
private static ItcastDataSourse dataSourse;
public Myconn(ItcastDataSourse dataSourse,Connection con) {
this.dataSourse = dataSourse;
this.con = con;
}
//关闭方法
public void close() throws SQLException {
this.dataSourse.add(this);
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class ItcastDataSourse {
//泛型创建连接集合
private static List<Myconn> connList = new ArrayList<Myconn>();
//初始化池的时候,创建3个连接对象。
public ItcastDataSourse() throws ClassNotFoundException, SQLException {
//四大连接参数
String user = "root";
String password ="123456";
String className = ("com.masql.jdbc.Driver");
Class.forName(className);
String url ="jdbc:mysql://localhost:3306/student";
//循环创建3个连接对象
for(int i=0;i<3;i++) {
//创建底层对象
Connection con = DriverManager.getConnection(url, user, password);
//创建包装对象
Myconn myconn = new Myconn(this,con);
//把连接添加到池中
connList.add(myconn);
}
}
//包装getconnection方法
public Connection getConnection() {
if(connList.size() == 0) {
throw new RuntimeException("别要了,连接没有了,要等一会啊!");
}
return this.connList.remove(0);
}
//包装close方法
public void add(Myconn myconn) {
this.connList.add(myconn);
}
}
//泛型创建连接集合
private static List<Myconn> connList = new ArrayList<Myconn>();
//初始化池的时候,创建3个连接对象。
public ItcastDataSourse() throws ClassNotFoundException, SQLException {
//四大连接参数
String user = "root";
String password ="123456";
String className = ("com.masql.jdbc.Driver");
Class.forName(className);
String url ="jdbc:mysql://localhost:3306/student";
//循环创建3个连接对象
for(int i=0;i<3;i++) {
//创建底层对象
Connection con = DriverManager.getConnection(url, user, password);
//创建包装对象
Myconn myconn = new Myconn(this,con);
//把连接添加到池中
connList.add(myconn);
}
}
//包装getconnection方法
public Connection getConnection() {
if(connList.size() == 0) {
throw new RuntimeException("别要了,连接没有了,要等一会啊!");
}
return this.connList.remove(0);
}
//包装close方法
public void add(Myconn myconn) {
this.connList.add(myconn);
}
}