1. package my.util;  
  2.  
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.SQLException;  
  6. import java.util.Date;  
  7. import java.util.Vector;  
  8.  
  9. public class MyConnectionPool  
  10. {  
  11.     private static MyConnectionPool myPool; //自身静态成员 用于实现单例  
  12.     private static Vector<Connection> connPool;         //连接池缓存容器  
  13.     private static int poolMaxSize;             //连接池最大缓存数  
  14.     private String username;                //用户名  
  15.     private String password;                //密码  
  16.     private String driverClass;             //连接驱动  
  17.     private String url;                     //连接字符串  
  18.       
  19.     private MyConnectionPool() {  
  20.         String tempSize = PropertiesUtil.getValueByKey("poolMaxSize");  
  21.         if(null != tempSize && !"".equals(tempSize)) {   
  22.             poolMaxSize = Integer.parseInt(tempSize);  
  23.         }  
  24.           
  25.         username = PropertiesUtil.getValueByKey("username");  
  26.         password = PropertiesUtil.getValueByKey("password");  
  27.         driverClass = PropertiesUtil.getValueByKey("driverClass");  
  28.         url = PropertiesUtil.getValueByKey("url");  
  29.         connPool = new Vector<Connection>();  
  30.         int size = 0;  
  31.           
  32.         if(poolMaxSize > 5) {  
  33.             size = 5;  
  34.         } else {  
  35.             size = poolMaxSize;  
  36.         }  
  37.  
  38.         for(int i = 0; i < size; i++) {  
  39.             //预填充连接池  
  40.             connPool.add(createConnection());  
  41.         }  
  42.           
  43. //      for(Connection conn : connPool) {  
  44. //          System.out.println(conn);  
  45. //      }  
  46.     }  
  47.       
  48.     public static MyConnectionPool newInstance() {  
  49.         if(null == myPool)   
  50.             myPool = new MyConnectionPool();  
  51.         return myPool;  
  52.     }  
  53.       
  54.     public Connection createConnection() {  
  55.         Connection conn = null;  
  56.           
  57.         try 
  58.         {  
  59.             Class.forName(driverClass);  
  60.         }  
  61.         catch (ClassNotFoundException e)  
  62.         {  
  63.             e.printStackTrace();  
  64.         }  
  65.           
  66.         try 
  67.         {  
  68.             conn = DriverManager.getConnection(url, username, password);  
  69.         }  
  70.         catch (SQLException e)  
  71.         {  
  72.             e.printStackTrace();  
  73.         }  
  74.           
  75.         return conn;  
  76.     }  
  77.       
  78.     public static void releaseConnection(Connection conn) {  
  79.         if(connPool.size() < poolMaxSize)  
  80.             connPool.add(conn);  
  81.     }  
  82.       
  83.     public synchronized Connection getConnection() {  
  84.         //long startTime = new Date().getTime();  
  85.         ConnectionProxy proxy = new ConnectionProxy();  
  86.         int size = connPool.size();  
  87.           
  88.         if(0 == size) {  
  89.             Connection conn = createConnection();  
  90.             System.out.println("getConn conn = " + conn);  
  91.             proxy.setConn(conn);  
  92.             long endTime = new Date().getTime();  
  93.             //System.out.println("Total time = " + (endTime - startTime));  
  94.             return proxy.getProxyObject();  
  95.         }  
  96.  
  97.         Connection conn = connPool.get(size - 1);  
  98.         //System.out.println("getConnection index = " + (size - 1) + " conn = " + conn);  
  99.         proxy.setConn(conn);  
  100.         connPool.remove(size - 1);  
  101.         long endTime = new Date().getTime();  
  102.         //System.out.println("Total time = " + (endTime - startTime));  
  103.         return proxy.getProxyObject();  
  104.     }  
  105. }  

 

 

  1. package my.util;  
  2.  
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.IOException;  
  6. import java.util.Properties;  
  7.  
  8. public class PropertiesUtil  
  9. {  
  10.     private static Properties prop = new Properties();  
  11.     private static FileInputStream inputStream;  
  12.       
  13.     public static String getValueByKey(String key) {  
  14.         if(null == inputStream) {  
  15.             try 
  16.             {  
  17.                 inputStream = new FileInputStream("src/dbcp.properties");  
  18.             }  
  19.             catch (FileNotFoundException e)  
  20.             {  
  21.                 e.printStackTrace();  
  22.             }  
  23.         }  
  24.           
  25.         try 
  26.         {  
  27.             prop.load(inputStream);  
  28.         }  
  29.         catch (IOException e)  
  30.         {  
  31.             e.printStackTrace();  
  32.         }  
  33.           
  34.         return prop.getProperty(key);  
  35.     }  
  36. }  

 

 

  1. package my.util;  
  2.  
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6. import java.sql.Connection;  
  7.  
  8.  
  9. public class ConnectionProxy implements InvocationHandler  
  10. {  
  11.     private Connection conn;  
  12.       
  13.     public Connection getConn()  
  14.     {  
  15.         return conn;  
  16.     }  
  17.  
  18.     public void setConn(Connection conn)  
  19.     {  
  20.         this.conn = conn;  
  21.     }  
  22.  
  23.     public ConnectionProxy() {}  
  24.       
  25.     public ConnectionProxy(Connection conn) {  
  26.         this.conn = conn;  
  27.     }  
  28.       
  29.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  
  30.     {  
  31.         if("close".equals(method.getName())) {  
  32.             System.out.println("invoke " + conn +" before.");  
  33.             MyConnectionPool.releaseConnection(conn);  
  34.             System.out.println("invoke " + conn +" after.");  
  35.         } else {  
  36.             return method.invoke(conn, args);  
  37.         }  
  38.         return null;  
  39.     }  
  40.       
  41.     public Connection getProxyObject() {  
  42.           
  43. //      Class[] clazzs = conn.getClass().getInterfaces();  
  44. //        
  45. //      for(Class clazz : clazzs) {  
  46. //          System.out.println(clazz);  
  47. //      }  
  48.           
  49.         Connection proxyConn = (Connection) Proxy.newProxyInstance(this.conn.getClass().getClassLoader(),   
  50.                 new Class[]{Connection.class}, this);  
  51.         return proxyConn;  
  52.     }  
  53. }  

 

 

Test.Class

  1. package my.util;  
  2.  
  3. import java.sql.Connection;  
  4.  
  5. public class TestConnPool  
  6. {  
  7.     public static void main(String[] args) throws Exception  
  8.     {  
  9.         MyConnectionPool myPool = MyConnectionPool.newInstance();  
  10.         Connection conn = myPool.getConnection();  
  11.         Connection conn2 = myPool.getConnection();  
  12.         Connection conn3 = myPool.getConnection();  
  13.         Connection conn4 = myPool.getConnection();  
  14.         Connection conn5 = myPool.getConnection();  
  15.           
  16.         System.out.println("conn : " + conn);  
  17.         System.out.println("conn2 : " + conn2);  
  18.         System.out.println("conn3 : " + conn3);  
  19.         System.out.println("conn4 : " + conn4);  
  20.         System.out.println("conn5 : " + conn5);  
  21.           
  22.         conn.close();  
  23.         conn2.close();  
  24.         conn3.close();  
  25.           
  26.         System.out.println(" ------- ");  
  27.           
  28.         conn = myPool.getConnection();  
  29.  
  30.         conn4.close();  
  31.         conn5.close();  
  32.         conn.close();  
  33.     }  
  34. }