编写数据库连接池

编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:
  Connection getConnection() 
  Connection getConnection(String username, String password) 
实现DataSource接口,并实现连接池功能的步骤:
在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。
实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。
 
public class JdbcPool extends DataSource {
    private static LinkedList<Connection> list = new LinkedList<Connection>();
    private static Properties prop =new Properties();
    static{
        try {
            InputStream inStream=JdbcPool.class.getClassLoader().getResourceAsStream("db.properties");
            prop.load(inStream);
            String driver = prop.getProperty("driver");
            String url = prop.getProperty("url");
            String username = prop.getProperty("username");
            String password = prop.getProperty("password");
        
            Class.forName(driver);
            for(int i=0;i<10;i++){
                Connection conn = DriverManager.getConnection(url, username, password);
                System.out.println("获取到了链接" + conn);
                list.add(conn);
            }
        } catch (Exception e){
            throw new RuntimeException(e);
        }
        
    }
    @Override
    public  Connection getConnection() throws SQLException {
        //这里不能用get(index)来获得链接,这个方法只是获得这个链接的引用
        Connection conn=list.removeFirst();
        MyConnection my=new MyConnection(conn);
        return my;
        
    }

    @Override
    public Connection getConnection(String arg0, String arg1)
            throws SQLException {
        // TODO Auto-generated method stub
        return super.getConnection(arg0, arg1);
    }
    
//conn.close():直接调用这个会直接关闭这个连接,不会还给连接池
    /* 在实际开发,发现对象的方法满足不了开发需求时,有三种方式对其进行增强
     * 1.生子类(使用这个方法要把这个类的信息导入子类中:写一个connecton子类,覆盖close方法,增强close方法(这里不适合,Connection是由mysql驱动得到的,
     *                 已经封装了连那个数据库,用户名等,假如这个方法行,要重写mysql的驱动)
     * 2.用包装设计模式(这里使用这个)---缺点:实现的方法太多了
     * 3.用动态代理    aop 面向切面编程(后边介绍)
     */

//1.定义一个类,实现与被增强相同的接口
//2.在类中定义一个变量,记住被增强对象
//3.定义一个构造函数,接收被增强对象
//4.覆盖想增强的方法
//5.对于不想增强的方法,直接调用目标对象(被增强对象)的方法

    class MyConnection implements Connection{
        private Connection conn;
        public MyConnection(Connection conn){
            this.conn=conn;   
        }public boolean isWrapperFor(Class<?> iface) throws SQLException {
            // TODO Auto-generated method stub
            return this.conn.isWrapperFor(iface);

      public void close() throws SQLException {
        list.add(conn);
      }

      .....还有很多方法(重写的方法太多)
   }


posted @ 2016-05-19 22:19  戒。  阅读(178)  评论(0编辑  收藏  举报