当前位置:编程学习 > JAVA >>

在实现连接池(commons-pool)中遇到的问题

我现在做一个实现连接池的功能,用到的接口是GenericObjectPool,假如我连接的时候有3个节点可用,那么我的保存的Map结构为:Map<String, GenericObjectPool> poolMap = new HashMap<String, GenericObjectPool>();String类型代表的是节点信息,也就是说每一个节点对应一个GenericObjectPool对象.

每一个GenericObjectPool初始化的大小为:
PoolableObjectFactory factory = new ObjectFactory();
        GenericObjectPool pool = new GenericObjectPool(factory);
        pool.setMaxActive(100);
        pool.setMaxIdle(100);
        pool.setMinIdle(10);
        pool.setMaxWait(150000);// 毫秒
        pool.setMinEvictableIdleTimeMillis(1000);
        pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK);
        this.poolMap.put(ip, pool);

上面的ObjectFactory是自定义的类,它现实了PoolableObjectFactory接口,其中重写的makeObject方法是通过对应节点上的GenericObjectPool对象去创建一个逻辑连接。

下面是一个SQL语句过来的执行体:

GenericObjectPool connPool = CacheManager.getInstance().pick(ip);
        try
        {
            client = connPool.borrowObject();//
            client.execute(sql)
        }
        // 连接上限的时候,达到设置的MaxWait,那么就抛此异常,这个时候应该当超时处理
        catch (NoSuchElementException e)
        {
            throw (NoSuchElementException) e;
        }
        catch (Exception e)
        {
            throw (SQLException) e;
        }
        finally
        {
            connPool.returnObject(client);
        }


现在问题来了,我用100个线程跑,如果我跑数据量小的sql语句的话,那么连接的监听端口一直维护在100,如果我跑大批数据量的话,刚刚启动的时候,监听端口是100,但执行后过了几十秒(20s左右),端口突然就减掉20-30个,那么这20-30请求也就失败。为什么在服务端压力过大的情况下,老是会掉20-30个连接?

补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,