一、testwhileidle是什么?
testwhileidle是apache.commons.pool2中的一个类,它是在对象池中用于空闲对象个数维护的函数。它在所有线程都处于等待状态时,会把所有的空闲对象进行一个校验,看它们是否都能正常工作。如果有任何一个对象校验失败,那么都会被清除,并重新创建。
二、使用场景
testwhileidle适用于以下几种场景:
1、需要定期对池中的对象进行校验,以确保空闲对象都能正常工作,防止由于长时间处在池中而导致无法工作的对象出现。
2、需要对池中的对象进行状态的时间感知,以及针对性的校验。例如,某个对象在长时间处于空闲状态后可能已经处于失效状态,那么可以使用testwhileidle来确保它的状态在被使用之前得到恢复。
3、需要对池进行前期的初始化,以便在池中后面出现大量请求时,池中的对象已经预先被创建出来,提高响应速度。
三、示例代码
public class ConnectionFactory extends BasePooledObjectFactory {
@Override
public Connection create() throws Exception {
// 创建连接代码
}
@Override
public PooledObject wrap(Connection obj) {
return new DefaultPooledObject<>(obj);
}
@Override
public boolean validateObject(PooledObject p) {
// 对象校验代码
}
@Override
public void destroyObject(PooledObject p) {
// 对象销毁代码
}
}
public class Main {
public static void main(String[] args) {
GenericObjectPoolConfig config = new GenericObjectPoolConfig<>();
config.setMaxTotal(10);
config.setMaxIdle(5);
config.setMinIdle(2);
config.setTestWhileIdle(true);
config.setTestOnBorrow(false);
config.setTestOnReturn(false);
config.setMinEvictableIdleTimeMillis(60000L);
config.setTimeBetweenEvictionRunsMillis(30000L);
ConnectionFactory factory = new ConnectionFactory();
try (GenericObjectPool pool = new GenericObjectPool<>(factory, config)) {
// 使用对象池中的连接进行业务操作
}
}
}
四、配置参数说明
1、setMaxTotal(int maxTotal):池的最大连接数。
2、setMaxIdle(int maxIdle):池中维护的最大空闲连接数。
3、setMinIdle(int minIdle):池中维护的最小空闲连接数。
4、setTestWhileIdle(boolean testWhileIdle):是否在空闲时检查池中对象的有效性。
5、setTestOnBorrow(boolean testOnBorrow):是否在获取对象时检查对象的有效性。
6、setTestOnReturn(boolean testOnReturn):是否在返回对象时检查对象的有效性。
7、setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis):在池中保持空闲状态的最小时间,超过这个时间未被使用的对象将被逐出池。
8、setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis):定时检查池中对象的间隔时间。
五、总结
testwhileidle是apache.commons.pool2中的一个类,用于在对象池中对空闲对象进行校验,在对象被使用之前确保它们处于正常工作状态。它的使用场景包括对池中对象进行定期校验、状态恢复、前期初始化等。通过上面的示例,我们可以看到它的具体用法,并了解到常用的配置参数及其作用。