在实现连接池(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相关