proxy代理对链接Connection的处理

package com.pool.cn;

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.LinkedList;

import org.junit.Test;

import com.utils.cn.JDBCUtils;
/***这里是主要代码**/
public class ConnPoolTest {

    private int init_count = 3;//连接池的初始值
    private int max_count = 6;//提供链接的最大值
    private int convert_count = 0;//链接的当前值
    LinkedList<Connection> list = new LinkedList<Connection>();

    // 创建连接
    public Connection createConnection() {
        Connection connection = JDBCUtils.getConnection();
        Connection proxycloseConnection = proxyCloseConnection(connection);
        return proxycloseConnection;
    }

    // 网链接池中添加连接
    public void connPool() {
        if (convert_count < init_count) {
            for (int i = 0; i < init_count; i++) {
                list.add(createConnection());
            }
        }
    }

    // 请求使用连接
    public Connection getConnection() {
        // 如果连接池中有
        if (list.size() > 0) {
            convert_count++;
            return list.removeFirst();
        }
        // 如果连接池没有,但是小于最大连接数
        if (convert_count < max_count) {
            convert_count++;
            return createConnection();
        }
        // 如果超出了最大连接数还在请求,抛出异常
        throw new RuntimeException("已经拿到最大连接数");
    }

    // 释放连接
    public void relaceseConnection(Connection connection) {
        // 如果连接数小于小于初始化的数目则放回连接池中
        if (list.size() < init_count) {
            convert_count--;
            list.add(connection);
        } else {
            try {
                connection.close();
                convert_count--;
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                throw new RuntimeException(e);
            }
        }
    }

    // 使用代理,来监听Connection中的方法
    public Connection proxyCloseConnection(Connection connection) {
        Connection proxy = (Connection) Proxy.newProxyInstance(Connection.class.getClassLoader(),
                new Class[] { Connection.class }, new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object result = null;
                        String name = method.getName();
                        if ("close".equals(name)) {
                            System.out.println("begin:close执行");
                            list.addLast(connection);
                            System.out.println("end:放入连接池");
                        } else {
                            result = method.invoke(connection, args);
                        }
                        return result;
                    }
                });
        return proxy;
    }

    @Test
    public void testName() throws Exception {
        connPool();
        Connection connection1 = getConnection();
        getConnection();
        getConnection();
        getConnection();
        getConnection();
        getConnection();
//        relaceseConnection(connection1);
        connection1.close();
        getConnection();
        System.out.println("连接池中剩余的连接数:" + list.size());
        System.out.println("连接池中的连接数:" + convert_count);
    }

}
时间: 2024-08-11 09:48:14

proxy代理对链接Connection的处理的相关文章

豆瓣Redis解决方案Codis源码剖析:Proxy代理

豆瓣Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy based high performance Redis cluster solution written in Go/C, an alternative to Twemproxy. It supports multiple stateless proxy with multiple redis instan

php设计模式之Proxy(代理模式)和Facade(外观)设计模式

Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对它所传递的数据进行修改或检查魔术方法使得Proxy的实现变的简单,Proxy模式的一类应用时用来记录方法的访问信息还可以利用Proxy的类确定代码的范围或调试程序中存在的问题 <?php class LoggingProxy{ private $target; //传递进去一个对象 public f

Proxy - 代理模式

定义 为其他对象提供一种代理以控制对这个对象的访问. 案例 对一个对象进行访问控制的原因在于只有确实需要这个对象的时候,才会进行创建和初始化.比如一个文件编辑系统,要打开一个文件,但是文件里边除了文字,还有许多的图片.而打开文件的时候,屏幕只有那么大,不一定能完整的显示.为了提升打开文件的速度,这时候不能显示的图片就可以延迟创建,在需要显示的时候才把它创建处对象,再显示出来,这时候就需要代理模式: ImageProxy就是Image的一个代理,只有需要画Image的时候,才会去创建Image对象

ES6新特性:Proxy代理器

ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome>39或者firefox>18: Proxy的基本使用: Proxy如其名, 它的作用是在对象和和对象的属性值之间设置一个代理,获取该对象的值或者设置该对象的值, 以及实例化等等多种操作, 都会被拦截住, 经过这一层我们可以统一处理,我们可以认为它就是“代理器” ; Proxy是一个构造函数, 使

设计模式12: Proxy 代理模式(结构型模式)

Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信,当增加一个C后,C和B只需要通信一次,A和C通信3次就好了. 动机(Motivation) 在面向对象系统中某些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全机制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦. 如果在不失去透明操作对象的同时来管理.控制这些

Apache开启Proxy代理,实现域名端口转发

今天帮客户迁移网站,客户一个是ASPX的一个是PHP的网站,这时候有2个域名,可是php网站是Apache下的伪静态,必须要用到Apache,但是ASPX网站还必要到IIS+Mssql 然后到了这个时候,IIS+Apache都是使用的80端口,肯定会起冲突的,这时候应该怎么办呢? 那么我们只能在Apache的配置文件里面配置Proxy代理功能~! 那么简单说下Apache下Proxy代理, 首先开启Apache的Proxy代理模块 httpd.conf文件: LoadModule proxy_m

zabbix proxy 代理端安装

理论部分 Zabbix Proxy适用于大规模分布式监控场景,采用的一种分担Server端压力的分层结构,Proxy只负责一定区域内的数据采集工作,然后定期将数据一次性发送给Server,极大的减轻了Server的负载压力,使得可以支持更大规模的监控需求. 实践部分 环境: 三台机器,其中proxy和agent可以通过内网访问,proxy和server需通过公网访问 IP:180.153.51.130(server端) IP:180.163.175.40(proxy端) IP:10.100.4.

Java设计模式——Proxy(代理)模式

Proxy(代理)模式为对象提供一个代理或者占位来控制对该对象的访问. 图像代理 使用Proxy模式的设计有时非常脆弱,它们依赖转发方法来调用其底层对象.转发可能会建立一个非常脆弱并且需要经常维护的设计. load()方法以JFrame对象为参数,用于在指定图像加载完毕之后进行回调.在执行load()方法的时候,它先以LOADING引用的图像对象为参数调用setImage(),然后重新绘制图形显示窗口,最后为自己启动一个单独的线程.而run()方法是在单独的线程中执行的,该方法根据构造器中指定的

设计模式(十三): Proxy代理模式 -- 结构型模式

  设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象