代理模式

来源:互联网 发布:js生成随机整数 编辑:程序博客网 时间:2024/05/26 02:21

package all;


//这是我的代理主题类


import java.util.LinkedList;
import java.sql.Connection;


import com.mysql.jdbc.Extension;
import com.mysql.jdbc.log.Log;


public class MyConnection implements Connection {
private Connection myconnecyion;
private createConnectionPool ccp;


MyConnection(Connection con, createConnectionPool ccp) {
this.myconnecyion = con;
this.ccp = ccp;
}


@Override
public void close() throws SQLException {
this.ccp.cp.add(myconnecyion);

}

//这是我对外提供方法和访问的类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;


public class createConnectionPool {
private  String url = "jdbc:mysql://localhost:3306/student";
private  String username = "root";
private  String password = "123";
private int count = 0;
private  int maxcount = 4;
private  int mincount =2;


 LinkedList<Connection> cp = new LinkedList<Connection>();


public  void dataSourse() throws Exception {
for (int i = 0; i < mincount;  i++) {
cp.addLast(create());
count++;
}
}


public MyConnection getConnection() throws Exception {
synchronized (cp) {
if (cp.size() > 0)
return (MyConnection)cp.removeFirst();
if (count < maxcount) {
count++;
return create();
}
throw new SQLException("链接数达到最大");
}
}


public  void free(MyConnection conn) {
cp.add(conn);
}


private MyConnection create() throws Exception {
Connection con = DriverManager.getConnection(url, username, password);
MyConnection mc = new MyConnection(con, this);
return mc;
}
}


//这是我的测试代码

package all;


public class test {


public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
createConnectionPool cp = new createConnectionPool();
cp.dataSourse();
for (int i = 0; i < 5; i++) {
MyConnection con = cp.getConnection();
System.out.println(con);
con.close();
}
}
}

//错误,前面两条结果是正确的,后面理论上也应该是MyConnection的链接,出来的却不是,而且,拿出来的链接似乎没放回去,有没有大牛啊,求解?!!!

all.MyConnection@15212bc
all.MyConnection@14c1103
all.MyConnection@f11404
com.mysql.jdbc.JDBC4Connection@1592174
com.mysql.jdbc.JDBC4Connection@97a560



/* 明白了,刚刚找出错误,因为在MyConnection类中的close方法中错误地将myconnecyion返回到链接池中,myconnecyion是Connection链接,而非MyConnection链接,*将myconnecyion改为this即可。

*/

0 0