天天看点

Apache Commons Pool高级配置项详解

Apache Commons Pool高级配置项详解

Commons Pool虽然是牛刀,不但要会用,更重要的是要用好,否则还不如不用,为此,必须掌握Commons Pool的高级参数配置,这是Commons Pool应用中非常重要的一个问题。

这些参数我以.properties文件的方式在自己的应用使用,但是,这并非Commons Pool所要求的,下面是我为可配置参数所写的一个properties文件,内容和注释如下:

pool.properties

#设置后进先出的池策略

lifo=true

#允许最大活动对象数

maxActive=24

#允许最大空闲对象数

maxIdle=6

#允许最大等待时间毫秒数

maxWait=150000

#被空闲对象回收器回收前在池中保持空闲状态的最小时间毫秒数

minEvictableIdleTimeMillis=100000

#允许最小空闲对象数

minIdle=0

#设定在进行后台对象清理时,每次检查对象数

numTestsPerEvictionRun=1

#指明是否在从池中取出对象前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.

testOnBorrow =false

#指明是否在归还到池中前进行检验

testOnReturn =false

#指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.

testWhileIdle=false

#在空闲连接回收器线程运行期间休眠的时间毫秒数. 如果设置为非正数,则不运行空闲连接回收器线程

timeBetweenEvictionRunsMillis=120000

#当池中对象用完时,请求新的对象所要执行的动作

whenExhaustedAction=1

实际上Commons Pool并不要求写这么个文件,对池的配置,Commons Pool也很随意,你不配置也能用。当然这个配置文件不能直接给Commons Pool使用,还需要自己读取每个元素的信息然后才能给pool来使用。

其实最好的方式是构建一个GenericKeyedObjectPool.Config的对象,将这个对象给pool来使用即可。

最简单的方法是:

GenericKeyedObjectPool.Config  cfg = new GenericKeyedObjectPool.Config();

cfg.set.....(prop.get(....,defaultvalue));

....

有了cfg对象,再构建池时候,就简单了:

        static {

                GenericKeyedObjectPool.Config cfg = new GenericKeyedObjectPool.Config();

                cfg.lifo = Boolean.valueOf(SysParamsToolkit.getProperty("lifo", "true"));

                cfg.maxActive = Integer.valueOf(SysParamsToolkit.getProperty("maxActive", "18"));

                cfg.maxIdle = Integer.valueOf(SysParamsToolkit.getProperty("maxIdle", "6"));

                cfg.maxWait = Integer.valueOf(SysParamsToolkit.getProperty("maxWait", "150000"));

                cfg.minEvictableIdleTimeMillis = Integer.valueOf(SysParamsToolkit.getProperty("minEvictableIdleTimeMillis", "100000"));

                cfg.minIdle = Integer.valueOf(SysParamsToolkit.getProperty("minIdle", "0"));

                cfg.numTestsPerEvictionRun = Integer.valueOf(SysParamsToolkit.getProperty("numTestsPerEvictionRun", "1"));

                cfg.lifo = Boolean.valueOf(SysParamsToolkit.getProperty("testOnBorrow", "false"));

                cfg.lifo = Boolean.valueOf(SysParamsToolkit.getProperty("testOnReturn", "false"));

                cfg.lifo = Boolean.valueOf(SysParamsToolkit.getProperty("testWhileIdle", "false"));

                cfg.timeBetweenEvictionRunsMillis = Integer.valueOf(SysParamsToolkit.getProperty("timeBetweenEvictionRunsMillis", "120000"));

                cfg.whenExhaustedAction = Byte.valueOf("whenExhaustedAction", 1);

                pool = new GenericKeyedObjectPool(new BaseKeyedPoolableObjectFactory() {

                        @Override

                        public Object makeObject(Object o) throws Exception {

                                if (o != null && o instanceof Socket)

                                        return o;

                                else

                                        return null;

                        }

                }, cfg);

        }