> iface) throws SQLException {return con.isWrapperFor(iface);}}
自 定 义 连 接 类/*自定义Connection连接类 。通过适配器设计模式 。完成close()方法的重写1.定义一个类,继承适配器父类2.定义Connection连接对象和连接池容器对象的变量3.提供有参构造方法,接收连接对象和连接池对象,对变量赋值4.在close()方法中,完成连接的归还*/public class MyConnection3 extends MyAdapter {//2.定义Connection连接对象和连接池容器对象的变量private Connection con;private List pool;//3.提供有参构造方法,接收连接对象和连接池对象,对变量赋值public MyConnection3(Connection con,List pool) {super(con);// 将接收的数据库连接对象给适配器父类传递this.con = con;this.pool = pool;}//4.在close()方法中,完成连接的归还@Overridepublic void close() throws SQLException {pool.add(con);}}
自定义连接池类public class MyDataSource implements DataSource{//定义集合容器,用于保存多个数据库连接对象private static List pool = Collections.synchronizedList(new ArrayList());//静态代码块,生成10个数据库连接保存到集合中static {for (int i = 0; i < 10; i++) {Connection con = JDBCUtils.getConnection();pool.add(con);}}//返回连接池的大小public int getSize() {return pool.size();}//从池中返回一个数据库连接@Overridepublic Connection getConnection() {if(pool.size() > 0) {//从池中获取数据库连接Connection con = pool.remove(0);//通过自定义连接对象进行包装//MyConnection2 mycon = new MyConnection2(con,pool);MyConnection3 mycon = new MyConnection3(con,pool);//返回包装后的连接对象return mycon;}else {throw new RuntimeException("连接数量已用尽");}}}
Test类public class MyDataSourceTest {public static void main(String[] args) throws Exception{MyDataSource dataSource = new MyDataSource();System.out.println("使用之前连接池数量:" + dataSource.getSize());Connection con = dataSource.getConnection();System.out.println(con.getClass());// JDBC4ConnectionString sql = "SELECT * FROM student";PreparedStatement pst = con.prepareStatement(sql);ResultSet rs = pst.executeQuery();while(rs.next()) {System.out.println(rs.getInt("sid") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getDate("birthday"));}rs.close();pst.close();con.close();System.out.println("使用之后连接池数量:" + dataSource.getSize());}}
(4)动态代理
经过我们适配器模式的改进,自定义连接类中的方法已经很简洁了 。剩余所有的方法已经抽取到了适配器类中 。但是适配器这个类还是我们自己编写的,也比较麻烦!所以可以使用动态代理的方式来改进 。
自 定 义 数 据 库 连 接 池public class MyDataSource implements DataSource{//定义集合容器,用于保存多个数据库连接对象private static List pool = Collections.synchronizedList(new ArrayList());//静态代码块,生成10个数据库连接保存到集合中static {for (int i = 0; i < 10; i++) {Connection con = JDBCUtils.getConnection();pool.add(con);}}//返回连接池的大小public int getSize() {return pool.size();}//动态代理方式@Overridepublic Connection getConnection() {if(pool.size() > 0) {//从池中获取数据库连接Connection con = pool.remove(0);Connection proxyCon = (Connection)Proxy.newProxyInstance(con.getClass().getClassLoader(), new Class[]{Connection.class}, new InvocationHandler() {/*执行Connection实现类所有方法都会经过invoke如果是close方法,则将连接还回池中如果不是,直接执行实现类的原有方法*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if(method.getName().equals("close")) {pool.add(con);return null;}else {return method.invoke(con,args);}}});return proxyCon;}else {throw new RuntimeException("连接数量已用尽");}}//从池中返回一个数据库连接/*@Overridepublic Connection getConnection() {if(pool.size() > 0) {//从池中获取数据库连接Connection con = pool.remove(0);//通过自定义连接对象进行包装//MyConnection2 mycon = new MyConnection2(con,pool);MyConnection3 mycon = new MyConnection3(con,pool);//返回包装后的连接对象return mycon;}else {throw new RuntimeException("连接数量已用尽");}}*/}