zoukankan      html  css  js  c++  java
  • jdk 动态代理 数据连接池

    package com.itheima.datasource;
    
    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.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.sql.DataSource;
    
    import com.itheima.utils.JdbcUtil;
    
    /**
     * 引入Sun标准数据源接口   为了更多的人去用
     *   DataSource  :javax.sql.DataSource
     * 
     * @author wangli
     *
     */
    public class MyDataSource3 implements DataSource {
        public static  List<Connection> pool = new ArrayList<Connection>();//池子
        private static int size=10;
        public static void setSize(int size) {
            MyDataSource3.size = size;
        }
        
        //初始化池中的连接
        static{
            try {
                for (int i = 0; i < size; i++) {
                    pool.add(JdbcUtil.getConnection());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
        
        //统一提供方法,用于从池中获取连接
        public  synchronized Connection getConnection(){
            if(pool.size()>0){
                final Connection con =  pool.remove(0);//删除这个连接,因为别人不能此时不能再用它 final 用匿名内部类里 con代表数据连接池里的池连接接口
                
                //代理模式   JDK自带的相应代理相关类
                //Proxy动态代理相关类
                //Proxy
                //        newProxyInstance(ClassLoader cl,Class<?>[] interfaces,InvocationHandler ih)
                // ClassLoader  :代表类加载器   被代理的对象用什么类加载器,代理对象就要用什么加载器
                //interfaces    :代表所实现的接口,被代理对象实现什么接口,代理对象就要实现什么接口
                //InvocationHandler  处理器  就是要处理相关的緢节问题  一般有一个匿名内部类
                                 //InvocationHandler 策略模式
                Connection proxyConn = (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(), con.getClass().getInterfaces(),
                         new InvocationHandler() {
                            
                            @Override
                            public Object invoke(Object proxy, Method method, Object[] args)
                                    throws Throwable {
                                if("close".equals(method.getName())){
                                    //对于close方法要改写   添加到池中
                                    return pool.add(con);//加入池中
                                }else{
                                    //对于其它方法,用mysql的connection对象的底层实现
                                    return method.invoke(con, args); 被代理对象和,被代理对象的方法里的参数
                                }
                            }
                        }
                        );
                return proxyConn;
            }else{
                throw new RuntimeException("池中无连接");
            }
            
        }
        
        //还回一个连接到池中
        public static void close(Connection con){
            pool.add(con);//将这个连接回收到池中
        }
        
        @Override
        public PrintWriter getLogWriter() throws SQLException {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public void setLogWriter(PrintWriter out) throws SQLException {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void setLoginTimeout(int seconds) throws SQLException {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public int getLoginTimeout() throws SQLException {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public <T> T unwrap(Class<T> iface) throws SQLException {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public boolean isWrapperFor(Class<?> iface) throws SQLException {
            // TODO Auto-generated method stub
            return false;
        }
    
    
    
        @Override
        public Connection getConnection(String username, String password)
                throws SQLException {
            // TODO Auto-generated method stub
            return null;
        }
        
        
        
    }
  • 相关阅读:
    关于数组的一些面试题目及答案
    java类的定义以及参数传递
    第39届大学生程序设计大赛亚洲区域赛广州站比赛总结
    模拟退火法(吊打XXX)Bzoj3680
    树链剖分(单点更新,求区间最值,区间求和Bzoj1036)
    树链剖分(线段树区间更新求和(lazy操作)hdu3966)
    最大权闭合图(Road constructions)hdu3917
    最大权闭合图最大获益(把边抽象为点)HDU3879
    最大权闭合图hdu3996
    最大密集子图(01分数规划+二分+最小割)POJ3155
  • 原文地址:https://www.cnblogs.com/baijin05/p/5075011.html
Copyright © 2011-2022 走看看