java学习笔记—标准连接池的实现(27)

javax.sql.DataSource.

Java.sql.*

DataSource 接口由驱动程序供应商实现。共有三种类型的实现:

  1. 基本实现 - 生成标准的 Connection 对象 – 一个DataSource数据源中,只有一个Connection ,这个不是池管理。
  2. 连接池实现 [W1] - 生成自动参与连接池的 Connection 对象。
  3. 分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。JTA.jar – SUN。

 

标准的连接池,要求:

       1:实现dataSource接口。

       2:声明一个集合类用于管理多个连接。

       3:必须要拥有一种能力,回收连接。

       4:必须要实现一个方法,getConnection以获取一个连接。

       5:实现DataSource接口的类,一般不能拥有static池对象。List.

       6:在一个程序中,要求只拥有一个DataSource实例就可以了。

以下是具体的实现:


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.LinkedList;

import javax.sql.DataSource;

/**

 * 标准的连接

 */

public class DBPool implements DataSource  {

    //声明一个池管理对象

    private LinkedList<Connection> pool = new LinkedList<Connection>();

    //在初始化这个DataSourc的子类时在构造方法设置多个连接

    public DBPool(){

        try{

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql:///db909?characterEncoding=UTf8";

            for(int i=0;i<3;i++){

                Connection con = DriverManager.getConnection(url,"root","1234");

                //将生成的这个连接。放到pool

                pool.add(con);

            }

        }catch(Exception e){

            throw new RuntimeException(e.getMessage(),e);

        }

    }

    public Connection getConnection() throws SQLException {

        return pool.removeFirst();

    }

    ///其他的方法。不实现

}

2:实现连接的回收

package cn.itcast.utils;



import java.io.PrintWriter;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.LinkedList;

import javax.sql.DataSource;

/**

 * 标准的连接

 */

public class DBPool implements DataSource {

    //声明一个池管理对象

    private LinkedList<Connection> pool = new LinkedList<Connection>();

    //在初始化这个DataSourc的子类时在构造方法设置多个连接

    public DBPool(){ 

        try{

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql:///db909?characterEncoding=UTf8";

            for(int i=0;i<3;i++){

                final Connection con = DriverManager.getConnection(url,"root","1234");

                Object proxyedConn =

                        Proxy.newProxyInstance(DBPool.class.getClassLoader(), 

                                new Class[]{Connection.class},

                                new InvocationHandler() {

                                    public Object invoke(Object proxyedConnection, Method method, Object[] args)

                                            throws Throwable {

                                        if(method.getName().equals("close")){

                                            synchronized (pool) { 

                                                pool.addLast((Connection) proxyedConnection);

                                                pool.notify();

                                            }

                                            return  null;

                                        }

                                        //目标方法的返回值

                                        Object returnValue=method.invoke(con, args); 

                                        return returnValue;

                                    }

                                });

                pool.add((Connection) proxyedConn);

            }

        }catch(Exception e){

            throw new RuntimeException(e.getMessage(),e);

        }

    }

    public Connection getConnection() throws SQLException { 

        synchronized (pool) {

            if(pool.size()==0){

                try {

                    pool.wait();

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

                return getConnection();

            }

            Connection con = pool.removeFirst();

            System.err.println("siize:"+pool.size());

            return con;

        }

    }

}

 

你可能感兴趣的:(Java学习)