• 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;
            }
        }
    }
  • 相关阅读:
    Android核心分析之二十五Android GDI之共享缓冲区机制
    Android核心分析之二十四Android GDI之显示缓冲管理
    Android核心分析之二十三Andoird GDI之基本原理及其总体框架
    Android核心分析之二十二Android应用框架之Activity
    Android核心分析之二十一Android应用框架之AndroidApplication
    Android核心分析之二十Android应用程序框架之无边界设计意图
    Android核心分析之十九电话系统之GSMCallTacker
    Android核心分析之十八Android电话系统之RIL-Java
    NFS 服务器的配置
    tftp 服务器的配置
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/4399132.html
Copyright © 2020-2023  润新知