自己动手写DataSource

字体大小: 中小 标准 ->行高大小: 标准
   DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项。DataSource能提供最高性能的对数据库的并发访问,数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。

         数据源提供了一种简单获取数据库连接的方式,并能在内部通过一个池的机制来复用数据库连接,这样就大大减少了创建数据库连接的次数,提高了系统性能。下面,我们自己动手实现个精简的数据源,代码如下:

Java代码  
  1. public class MyDataSource {   
  2.     private LinkedList<Connection> connectionPool = new LinkedList<Connection>();   
  3.   
  4.     public MyDataSource() {   
  5.         for (int i = 0; i < 10; i++) {   
  6.             connectionPool.add(new MyConnection(creatConnection(),this));   
  7.         }   
  8.     }   
  9.     private Connection creatConnection() {   
  10.         try {   
  11.             return DriverManager.getConnection(   
  12.                     "jdbc:mysql://localhost:3306/test""root""root");   
  13.         } catch (SQLException e) {   
  14.             // TODO Auto-generated catch block   
  15.             throw new ExceptionInInitializerError();   
  16.         }   
  17.     }   
  18.        
  19.     public Connection getConnection(){   
  20.         System.out.println(connectionPool.size());   
  21.         return connectionPool.removeFirst();   
  22.     }   
  23.        
  24.     public void freeConnection(Connection conn){   
  25.         System.out.println("DataSource Close Connection");   
  26.         connectionPool.addLast(conn);   
  27.     }   
  28. }  
 
Java代码  
  1. public class MyConnection  implements Connection{   
  2.     private Connection connection;   
  3.     private MyDataSource datasource;   
  4.     public Connection getConnection() {   
  5.         return connection;   
  6.     }   
  7.   
  8.     public void setConnection(Connection connection) {   
  9.         this.connection = connection;   
  10.     }   
  11.   
  12.     public MyConnection(Connection realconnection,MyDataSource datasource){   
  13.         this.connection=realconnection;   
  14.         this.datasource=datasource;   
  15.     }   
  16.        
  17.     @Override  
  18.     public void close() throws SQLException {   
  19.         // TODO Auto-generated method stub   
  20.         System.out.println("MyConnection Close");   
  21.         datasource.freeConnection(this);   
  22.     }   
  23.     ...   
  24. }  

        我们通过DataSource获得的Connection是经过包裹后的对象,这里应用到了代理模式。下面我们使用jdk的动态代理来改写MyDataSource:

Java代码  
  1. public class MyDataSource {   
  2.     private LinkedList<Connection> connectionPool = new LinkedList<Connection>();   
  3.   
  4.     public MyDataSource() {   
  5.         for (int i = 0; i < 10; i++) {   
  6.             connectionPool.add(GetProxy(creatConnection()));   
  7.         }   
  8.     }   
  9.   
  10.     private Connection GetProxy(final Connection connection) {   
  11.         // TODO Auto-generated method stub   
  12.         return (Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Connection.class}, new InvocationHandler(){   
  13.             @Override  
  14.             public Object invoke(Object proxy, Method method, Object[] args)   
  15.                     throws Throwable {   
  16.                 // TODO Auto-generated method stub   
  17.                 Object value;   
  18.                 if(method.getName().equalsIgnoreCase("close")){   
  19.                     connectionPool.addLast((Connection)proxy);   
  20.                     System.out.println(connectionPool.size());   
  21.                     return null;   
  22.                 }else{   
  23.                     value=method.invoke(connection, args);   
  24.                 }   
  25.                 System.out.println(connectionPool.size());   
  26.                 return value;   
  27.             }   
  28.                
  29.         });   
  30.            
  31.     }   
  32.   
  33.     private Connection creatConnection() {   
  34.         try {   
  35.             return DriverManager.getConnection(   
  36.                     "jdbc:mysql://localhost:3306/test""root""root");   
  37.         } catch (SQLException e) {   
  38.             // TODO Auto-generated catch block   
  39.             throw new ExceptionInInitializerError();   
  40.         }   
  41.     }   
  42.        
  43.     public Connection getConnection(){   
  44.         System.out.println(connectionPool.size());   
  45.         return connectionPool.removeFirst();   
  46.     }   
  47.        
  48.     public void freeConnection(Connection conn){   
  49.         System.out.println("DataSource Close Connection");   
  50.         connectionPool.addLast(conn);   
  51.     }   
  52. }  

       通过这种方式获得的Connection是通过jdk的动态代理生成的一个代理对象,该代理对象实现了Connection接口。

       以上两种方式实现了我们自己的DataSource,在我们通过DataSource获得的Connection对象的close方法都已经被改写过了。在Connection对象调用close方法时,会将该Connection对象放入到缓存池中,而不是关闭对象。

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/70219.html