A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© CrazyProgram 中级黑马   /  2013-4-30 18:52  /  1141 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. import java.sql.Connection;
  5. import java.sql.DriverManager;
  6. import java.util.LinkedList;

  7. //自定义连接池
  8. public class Pool {
  9.         private static LinkedList<Connection> linkedList = new LinkedList<Connection>();
  10.         static{
  11.                 //在加载Pool类时,创建10个连接,并加入到连接池中
  12.                 for(int i=0;i<10;i++){
  13.                         try {
  14.                                 Class.forName("com.mysql.jdbc.Driver");
  15.                                 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bbs","root","zhiwei");
  16.                                 linkedList.addLast(conn);
  17.                         } catch (Exception e) {
  18.                         }
  19.                 }
  20.         }
  21.         //取得连接池中连接的个数
  22.         public int getSize() {
  23.                 return linkedList.size();
  24.         }
  25.         //取得一个空闲的连接,只能返回Connection的动态代理对象
  26.         public Connection getConnection() {
  27.                 final Connection conn = linkedList.removeFirst();
  28.                 return (Connection) Proxy.newProxyInstance(
  29.                                 Pool.class.getClassLoader(),
  30.                                 conn.getClass().getInterfaces(),
  31.                                 new InvocationHandler(){
  32.                                         public Object invoke(
  33.                                                         Object proxy,
  34.                                                         Method method,
  35.                                                         Object[] args) throws Throwable {
  36.                                                 //如果调用的是close()方法
  37.                                                 if("close".equals(method.getName())){
  38.                                                         //将连接放回连接池
  39.                                                         linkedList.addLast(conn);
  40.                                                         //返回null
  41.                                                         return null;
  42.                                                 }else{
  43.                                                         return method.invoke(conn,args);
  44.                                                 }
  45.                                         }
  46.                                 });
  47.         }
  48.        
  49. }
复制代码
测试的类
  1. package zhiwei.deng.web.reflect.pool;

  2. import java.sql.Connection;
  3. import java.sql.SQLException;

  4. public class Test {
  5.         public static void main(String[] args) throws Exception {
  6.                 //创建连接池
  7.                 Pool pool = new Pool();
  8.                 //连接池的个数
  9.                 System.out.println("开始的时候连接池的个数为"+pool.getSize());
  10.                 //取得一个空闲的连接从连接池中
  11.                 Connection conn = pool.getConnection();
  12.                 System.out.println("取出一个后的个数为"+pool.getSize());
  13.                 //关闭连接
  14.                 conn.close();
  15.                 System.out.println("关闭连接后的个数为"+pool.getSize());
  16.         }
  17. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马