commons-pool2(2.6.2)实现对象池-jdk8
springboot web项目中,有很多 非线程安全类(jdk自带或者第三方包引入),每次都创建一个 不太友好。就使用 commons-pool2 实现对象池处理,有两种实现方式:
GenericObjectPool<T>,GenericObjectPoolConfig<T>
GenericKeyedObjectPool<T>,GenericKeyedObjectPoolConfig<T>
频繁的创建和销毁,会极大的降低系统的性能,而对象池会在初始化的时候会创建一定数量的对象,每次访问只需从对象池中获取对象,使用完毕后再放回对象池,并不是直接销毁,这样可以保证程序重复使用同一个对象而不需要每次访问都创建和销毁对象, 从而提高系统性能
参考链接
springboot使用commons-pool2实现对象池
commons-pool实战之 KeyedPoolableObjectFactory和KeyedObjectPool
GenericObjectPool参数解析
聊聊GenericObjectPool的泄露检测
commons-pool2 3 - 配置介绍,BaseObjectPoolConfig,AbandonedConfig,EvictionConfig
apache-common-pool2对象池的使用
list或数组转map代码-demo
public static final String[] KEYS = {"K1","K2","K3","K4"};
// 数组 转 map
Map<String, ArrayList<TestObject>> map = Stream.of(KEYS)
.collect(Collectors.toMap(String::trim,k->new ArrayList<>(size),(k1, k2) -> k1));
// list 转 map
List<String> keys = Arrays.asList(KEYS);
Map<String, ArrayList<TestObject>> map = keys.stream()
.collect(Collectors.toMap(k->k, k -> new ArrayList<>(size), (k1, k2) -> k1));
正文
pom
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.2</version>
</dependency>
实体类-池化主体
package ***.pools;
/**
* 待池化对象
*
* @author z.y.
* @version v1.0
* @date 2022/3/28
*/
public class TestObject {
private String name;
private boolean active;
public TestObject(){}
public TestObject(String name){ this.name = name; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public void setActive(boolean active) { this.active = active; }
public boolean isActive() { return active; }
public void destroy(){
active = false;
System.out.println(name+":销毁");
}
}
方案1-对象池
package ***.pools;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.AbandonedConfig;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
/**
* 对象池
*
* @author z.y.
* @version v1.0
* @date 2022/3/28
*/
public class TestObjectPool extends GenericObjectPool<TestObject> {
public TestObjectPool(PooledObjectFactory<TestObject> factory) {
super(factory);
}
public TestObjectPool(PooledObjectFactory<TestObject> factory, GenericObjectPoolConfig<TestObject> config) {
super(factory, config);
}
public TestObjectPool(PooledObjectFactory<TestObject> factory, GenericObjectPoolConfig<TestObject> config, AbandonedConfig abandonedConfig) {
super(factory, config, abandonedConfig);
//maxWaitMillis 当连接池资源耗尽时,等待时间,超出则抛异常,默认为-1即永不超时
//testOnCreate 默认false,create的时候检测是有有效,如果无效则从连接池中移除,并尝试继续获取
//numTestsPerEvictionRun 在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认为3
//minEvictableIdleTimeMillis 连接空闲的最小时间,达到此值后空闲连接将可能会被移除。默认为1000L 60L 30L
//softMinEvictableIdleTimeMillis 连接空闲的最小时间,达到此值后空闲链接将会被移除,且保留minIdle个空闲连接数。默认为-1.
//evictionPolicyClassName evict策略的类名,默认为org.apache.commons.pool2.impl.DefaultEvictionPolicy
//EvictConfig针对的是idle状态下,进行"驱逐',默认DefaultEvictionPolicy
//idleEvictTime pooledObject保持了idle状态的时长超过了该值,会被evict
//idleSoftEvictTime 软标准情况下,pooledObject保持了idle状态的时长,判断是否evict
//minIdle 软标准情况下,至少留下几个object继续保持idle(节省开销)
//AbandonedConfig 针对的是allocate状态下(或者说active状态下),进行"丢弃",只有GenericObjectPool可以用
//一般是用于连接泄露的检测,检测的是在使用的对象,比如怀疑那个对象被占用时间超长,那估计是程序异常或bug导致对象borrow了但忘记归还,或者对象borrow之后使用时间太长
//removeAbandonedOnBorrow 在borrow的时候,是否执行abandon判断,默认false
//removeAbandonedOnMaintenance 是否在evictor中执行abandon判断,默认false
//removeAbandonedTimeout 一个对象在被borrow之后多少秒未归还则认为是abandon,默认为300
//logAbandoned 是否打印abandon的日志,默认为false
//useUsageTracking 是否追踪对象调用并保留最近的调用记录方便debug
}
}
方案2-对象池
package ***.pools;
import org.apache.commons.pool2.KeyedPooledObjectFactory;
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
/**
* 对象池-通过key获取
*
* @author z.y.
* @version v1.0
* @date 2022/3/29
*/
public class TestKeyObjectPool extends GenericKeyedObjectPool<String,TestObject> {
public TestKeyObjectPool(KeyedPooledObjectFactory<String, TestObject> factory) {
super(factory);
}
public TestKeyObjectPool(KeyedPooledObjectFactory<String, TestObject> factory, GenericKeyedObjectPoolConfig<TestObject> config) {
super(factory, config);
}
}
方案1-工厂类
package ***.pools;
import ***.enums.DateFormatEnum;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
/**
* TestObject 工厂类
*
* @author z.y.
* @version v1.0
* @date 2022/3/28
*/
public class TestObjectFactory implements PooledObjectFactory<TestObject> {
/** 构建对象 */
@Override
public PooledObject<TestObject> makeObject() throws Exception {
TestObject object = new TestObject(DateFormatEnum.y_M_d_H_m_s_S_1.format());
System.out.println(object.getName() + ",构建对象");
return new DefaultPooledObject<>(object);
}
/** 销毁对象 */
@Override
public void destroyObject(PooledObject<TestObject> pooledObject) throws Exception {
TestObject object = pooledObject.getObject();
System.out.println(object.getName() + ",销毁对象");
object.destroy();
}
/** 验证对象是否可用 */
@Override
public boolean validateObject(PooledObject<TestObject> pooledObject) {
TestObject object = pooledObject.getObject();
System.out.println(object.getName() + ",验证对象是否可用");
return object.isActive();
}
/** 激活对象,使其可用 */
@Override
public void activateObject(PooledObject<TestObject> pooledObject) throws Exception {
TestObject object = pooledObject.getObject();
System.out.println(object.getName() + ",激活对象,使其可用");
object.setActive(true);
}
/** 钝化一个对象,反初始化 */
@Override
public void passivateObject(PooledObject<TestObject> pooledObject) throws Exception {
System.out.println(pooledObject.getObject().getName() + ",钝化一个对象");
}
}
方案2-工厂类
package ***.pools;
import ***.enums.DateFormatEnum;
import org.apache.commons.pool2.KeyedPooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
/**
* TestObject 工厂类-通过key获取
*
* @author z.y.
* @version v1.0
* @date 2022/3/29
*/
public class TestKeyObjectFactory implements KeyedPooledObjectFactory<String,TestObject> {
/** 构建对象 */
@Override
public PooledObject<TestObject> makeObject(String key) throws Exception {
TestObject object = new TestObject(key +"[k]:"+DateFormatEnum.y_M_d_H_m_s_S_1.format());
System.out.println(object.getName() + ",k-构建对象");
return new DefaultPooledObject<>(object);
}
/** 销毁对象 */
@Override
public void destroyObject(String s, PooledObject<TestObject> pooledObject) throws Exception {
TestObject object = pooledObject.getObject();
System.out.println(object.getName() + ",k-销毁对象");
object.destroy();
}
@Override
public boolean validateObject(String s, PooledObject<TestObject> pooledObject) {
TestObject object = pooledObject.getObject();
System.out.println(object.getName() + ",k-验证对象是否可用");
return object.isActive();
}
@Override
public void activateObject(String s, PooledObject<TestObject> pooledObject) throws Exception {
TestObject object = pooledObject.getObject();
System.out.println(object.getName() + ",k-激活对象");
object.setActive(true);
}
@Override
public void passivateObject(String s, PooledObject<TestObject> pooledObject) throws Exception {
System.out.println(pooledObject.getObject().getName() + ",k-钝化一个对象");
}
}
配置类
package ***.pools;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 对象池配置
*
* @author z.y.
* @version v1.0
* @date 2022/3/28
*/
@ConfigurationProperties(prefix = TestPoolProperties.PRE)
public class TestPoolProperties {
public static final String PRE = "pro.obj";
/** 最大空闲 */
private int maxIdle = 2;
/** 最大总数 */
private int maxTotal = 5;
/** 最小空闲 */
private int minIdle = 0;
/** 初始化 */
private int initialSize = 1;
/** Key最大空闲 */
private int maxIdleKey = 2;
/** Key最大总数 */
private int maxTotalKey = 5;
/** Key最小空闲 */
private int minIdleKey = 0;
/** Key初始化 */
private int initialSizeKey = 1;
public int getMaxIdle() { return maxIdle; }
public void setMaxIdle(int maxIdle) { this.maxIdle = maxIdle; }
public int getMaxTotal() { return maxTotal; }
public void setMaxTotal(int maxTotal) { this.maxTotal = maxTotal; }
public int getMinIdle() { return minIdle; }
public void setMinIdle(int minIdle) { this.minIdle = minIdle; }
public int getInitialSize() { return initialSize; }
public void setInitialSize(int initialSize) { this.initialSize = initialSize; }
public int getMaxIdleKey() { return maxIdleKey; }
public void setMaxIdleKey(int maxIdleKey) { this.maxIdleKey = maxIdleKey; }
public int getMaxTotalKey() { return maxTotalKey; }
public void setMaxTotalKey(int maxTotalKey) { this.maxTotalKey = maxTotalKey; }
public int getMinIdleKey() { return minIdleKey; }
public void setMinIdleKey(int minIdleKey) { this.minIdleKey = minIdleKey; }
public int getInitialSizeKey() { return initialSizeKey; }
public void setInitialSizeKey(int initialSizeKey) { this.initialSizeKey = initialSizeKey; }
}
配置自动装配
package ***.pools;
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PreDestroy;
import java.util.concurrent.TimeUnit;
/**
* 自动装配 对象池配置
*
* @author z.y.
* @version v1.0
* @date 2022/3/28
*/
@Configuration
@EnableConfigurationProperties(TestPoolProperties.class)
public class TestPoolCfg {
private final TestPoolProperties testPoolProperties;
private TestObjectPool pool;
private TestKeyObjectPool keyPool;
@Autowired
public TestPoolCfg(TestPoolProperties testPoolProperties){
this.testPoolProperties = testPoolProperties;
}
@Bean
@ConditionalOnClass(TestObjectFactory.class)
protected TestObjectPool objectPool(){
TestObjectFactory factory = new TestObjectFactory();
GenericObjectPoolConfig<TestObject> config = new GenericObjectPoolConfig<>();
//链接池中最大连接数,默认为8
config.setMaxTotal(testPoolProperties.getMaxTotal());
//链接池中最大空闲的连接数,默认也为8
config.setMaxIdle(testPoolProperties.getMaxIdle());
//连接池中最少空闲的连接数,默认为0
config.setMinIdle(testPoolProperties.getMinIdle());
//当这个值为true的时候,maxWaitMillis参数才能生效。为false的时候,当连接池没资源,则立马抛异常。默认为true
config.setBlockWhenExhausted(true);
//默认false,borrow的时候检测是有有效,如果无效则从连接池中移除,并尝试继续获取
config.setTestOnBorrow(true);
//默认false,return的时候检测是有有效,如果无效则从连接池中移除,并尝试继续获取
config.setTestOnReturn(true);
//默认false,在evictor线程里头,当evictionPolicy.evict方法返回false时,而且testWhileIdle为true的时候则检测是否有效,如果无效则移除
config.setTestWhileIdle(true);
//空闲链接检测线程检测的周期,毫秒数。如果为负值,表示不运行检测线程。默认为-1
config.setTimeBetweenEvictionRunsMillis(1000*60*30);
//一定要关闭jmx,不然springboot启动会报已经注册了某个jmx的错误
config.setJmxEnabled(false);
// 新建 对象池,并传入 配置
pool = new TestObjectPool(factory,config);
initPool(testPoolProperties.getInitialSize(),testPoolProperties.getMaxIdle());
return pool;
}
/** 预加载 对象到对象池 */
private void initPool(int initialSize,int maxIdle){
if( initialSize < 0 ){ return; }
int size = Math.max(initialSize,maxIdle);
try {
for (int i = 0; i < size; i++) {
pool.addObject();
TimeUnit.MILLISECONDS.sleep(100L);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/** 多个key 每个key 一个组*/
public static final String[] KEYS = {"K1","K2","K3","K4"};
@Bean
@ConditionalOnClass(TestObjectFactory.class)
protected TestKeyObjectPool keyObjectPool(){
TestKeyObjectFactory factory = new TestKeyObjectFactory();
GenericKeyedObjectPoolConfig<TestObject> config = new GenericKeyedObjectPoolConfig<>();
// 多个key组 总最大数
config.setMaxTotal(testPoolProperties.getMaxTotalKey()*KEYS.length);
// 一个key组 最大数
config.setMaxTotalPerKey(testPoolProperties.getMaxTotalKey());
// 一个key组 最大空闲数
config.setMaxIdlePerKey(testPoolProperties.getMaxIdleKey());
// 一个key组 最小空闲数
config.setMinIdlePerKey(testPoolProperties.getMinIdleKey());
config.setBlockWhenExhausted(true);
config.setTestOnReturn(true);
config.setTestOnBorrow(true);
config.setTestWhileIdle(true);
config.setTimeBetweenEvictionRunsMillis(1000*60*30);
config.setJmxEnabled(false);
keyPool = new TestKeyObjectPool(factory,config);
initKeyPool(testPoolProperties.getInitialSize(),testPoolProperties.getMaxIdle());
return keyPool;
}
/** 预加载 对象到对象池 */
private void initKeyPool(int initialSize,int maxIdle){
if( initialSize < 0 ){ return; }
int size = Math.max(initialSize,maxIdle);
try {
for (int i = 0; i < size; i++) {
for (String key : KEYS) { keyPool.addObject(key); }
TimeUnit.MILLISECONDS.sleep(100L);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@PreDestroy
public void destroy(){
System.out.println("对象池关闭-start");
if( null != pool ){ pool.close(); }
if( null != keyPool ){ keyPool.close(); }
System.out.println("对象池关闭-end");
}
}
测试
代码
package ***.controller;
import ***.enums.DateFormatEnum;
import ***.pools.TestKeyObjectPool;
import ***.pools.TestObject;
import ***.pools.TestObjectPool;
import ***.pools.TestPoolCfg;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* TestController 类说明:
*
* @author z.y.
* @version v1.0
* @date 2022/3/25
*/
@RestController
@RequestMapping ("/test")
@Api (value = "test-测试",tags = {"test-测试"})
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
private TestObjectPool testObjectPool;
private TestKeyObjectPool testKeyObjectPool;
@Autowired
public void setTestObjectPool(TestObjectPool testObjectPool) {
this.testObjectPool = testObjectPool;
}
@Autowired
public void setTestKeyObjectPool(TestKeyObjectPool testKeyObjectPool) {
this.testKeyObjectPool = testKeyObjectPool;
}
@GetMapping("pool")
@ApiOperation(value = "测试对象池1",notes = "测试对象池1-[jk-zyl]")
public void pool(int size){
size = Math.max(1, size);
pool1(size);
pool2(size);
}
public void pool1(int size){
List<TestObject> list = new ArrayList<>(size);
try {
TestObject object;
for (int i = 0; i < size; i++) {
if( testObjectPool.getNumActive() >= testObjectPool.getMaxTotal() ){
object = list.get(0);
testObjectPool.returnObject(object);
list.remove(0);
logger.info("\n{},测试对象池,回收",object.getName());
}
object = testObjectPool.borrowObject();
logger.info("\n{},测试对象池,下标:{},list:{},活跃:{},空闲:{}",object.getName(),i,list.size(),testObjectPool.getNumActive(),testObjectPool.getNumIdle());
list.add(object);
}
} catch (Exception e) {
logger.error("异常",e);
}finally {
for (TestObject object : list) {
if( null != object ){
testObjectPool.returnObject(object);
}
}
}
}
public void pool2(int size){
List<String> keys = Arrays.asList(TestPoolCfg.KEYS);
// list 转 map
Map<String, ArrayList<TestObject>> map = keys.stream()
.collect(Collectors.toMap(k->k, k -> new ArrayList<>(size), (k1, k2) -> k1));
try {
TestObject object;
for (int i = 0; i < size; i++) {
for (String key : keys) {
if( testKeyObjectPool.getNumActive() >= testKeyObjectPool.getMaxTotal() ){
object = map.get(key).get(0);
testKeyObjectPool.returnObject(key,object);
map.get(key).remove(0);
logger.info("\n{},k-测试对象池,回收",object.getName());
}
object = testKeyObjectPool.borrowObject(key);
logger.info("\n{},{},k-测试对象池,下标:{},list:{},活跃:{},空闲:{}",key,object.getName(),i,map.get(key).size()
,testKeyObjectPool.getNumActive(),testKeyObjectPool.getNumIdle());
map.get(key).add(object);
}
}
} catch (Exception e) {
logger.error("异常",e);
}finally {
for (String key : map.keySet()) {
for (TestObject object : map.get(key)) {
if( null != object ){
testKeyObjectPool.returnObject(key,object);
}
}
}
}
}
}
日志
项目启动日志
2022-03-29 10:39:34.406,构建对象
2022-03-29 10:39:34.406,钝化一个对象
2022-03-29 10:39:34.511,构建对象
2022-03-29 10:39:34.511,钝化一个对象
K1[k]:2022-03-29 10:39:34.657,k-构建对象
K1[k]:2022-03-29 10:39:34.657,k-钝化一个对象
K2[k]:2022-03-29 10:39:34.658,k-构建对象
K2[k]:2022-03-29 10:39:34.658,k-钝化一个对象
K3[k]:2022-03-29 10:39:34.658,k-构建对象
K3[k]:2022-03-29 10:39:34.658,k-钝化一个对象
K4[k]:2022-03-29 10:39:34.659,k-构建对象
K4[k]:2022-03-29 10:39:34.659,k-钝化一个对象
K1[k]:2022-03-29 10:39:34.759,k-构建对象
K1[k]:2022-03-29 10:39:34.759,k-钝化一个对象
K2[k]:2022-03-29 10:39:34.759,k-构建对象
K2[k]:2022-03-29 10:39:34.759,k-钝化一个对象
K3[k]:2022-03-29 10:39:34.759,k-构建对象
K3[k]:2022-03-29 10:39:34.759,k-钝化一个对象
K4[k]:2022-03-29 10:39:34.759,k-构建对象
K4[k]:2022-03-29 10:39:34.759,k-钝化一个对象
测试路径http://localhost/test/pool?size=8
。
测试日志
2022-03-29 10:39:34.511,激活对象,使其可用
2022-03-29 10:39:34.511,验证对象是否可用
2022-03-29 10:39:53.072 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:34.511,测试对象池,下标:0,list:0,活跃:1,空闲:1
2022-03-29 10:39:34.406,激活对象,使其可用
2022-03-29 10:39:34.406,验证对象是否可用
2022-03-29 10:39:53.072 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:34.406,测试对象池,下标:1,list:1,活跃:2,空闲:0
2022-03-29 10:39:53.072,构建对象
2022-03-29 10:39:53.072,激活对象,使其可用
2022-03-29 10:39:53.072,验证对象是否可用
2022-03-29 10:39:53.072 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:53.072,测试对象池,下标:2,list:2,活跃:3,空闲:0
2022-03-29 10:39:53.072,构建对象
2022-03-29 10:39:53.072,激活对象,使其可用
2022-03-29 10:39:53.072,验证对象是否可用
2022-03-29 10:39:53.073 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:53.072,测试对象池,下标:3,list:3,活跃:4,空闲:0
2022-03-29 10:39:53.073,构建对象
2022-03-29 10:39:53.073,激活对象,使其可用
2022-03-29 10:39:53.073,验证对象是否可用
2022-03-29 10:39:53.073 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:53.073,测试对象池,下标:4,list:4,活跃:5,空闲:0
2022-03-29 10:39:34.511,验证对象是否可用
2022-03-29 10:39:34.511,钝化一个对象
2022-03-29 10:39:53.073 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:34.511,测试对象池,回收
2022-03-29 10:39:34.511,激活对象,使其可用
2022-03-29 10:39:34.511,验证对象是否可用
2022-03-29 10:39:53.073 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:34.511,测试对象池,下标:5,list:4,活跃:5,空闲:0
2022-03-29 10:39:34.406,验证对象是否可用
2022-03-29 10:39:34.406,钝化一个对象
2022-03-29 10:39:53.073 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:34.406,测试对象池,回收
2022-03-29 10:39:34.406,激活对象,使其可用
2022-03-29 10:39:34.406,验证对象是否可用
2022-03-29 10:39:53.073 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:34.406,测试对象池,下标:6,list:4,活跃:5,空闲:0
2022-03-29 10:39:53.072,验证对象是否可用
2022-03-29 10:39:53.072,钝化一个对象
2022-03-29 10:39:53.073 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:53.072,测试对象池,回收
2022-03-29 10:39:53.072,激活对象,使其可用
2022-03-29 10:39:53.072,验证对象是否可用
2022-03-29 10:39:53.073 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
2022-03-29 10:39:53.072,测试对象池,下标:7,list:4,活跃:5,空闲:0
2022-03-29 10:39:53.072,验证对象是否可用
2022-03-29 10:39:53.072,钝化一个对象
2022-03-29 10:39:53.073,验证对象是否可用
2022-03-29 10:39:53.073,钝化一个对象
2022-03-29 10:39:34.511,验证对象是否可用
2022-03-29 10:39:34.511,钝化一个对象
2022-03-29 10:39:34.511,销毁对象
2022-03-29 10:39:34.511:销毁
2022-03-29 10:39:34.406,验证对象是否可用
2022-03-29 10:39:34.406,钝化一个对象
2022-03-29 10:39:34.406,销毁对象
2022-03-29 10:39:34.406:销毁
2022-03-29 10:39:53.072,验证对象是否可用
2022-03-29 10:39:53.072,钝化一个对象
2022-03-29 10:39:53.072,销毁对象
2022-03-29 10:39:53.072:销毁
K1[k]:2022-03-29 10:39:34.759,k-激活对象
K1[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
2022-03-29 10:39:53.075 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1,K1[k]:2022-03-29 10:39:34.759,k-测试对象池,下标:0,list:0,活跃:1,空闲:7
K2[k]:2022-03-29 10:39:34.759,k-激活对象
K2[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
2022-03-29 10:39:53.075 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2,K2[k]:2022-03-29 10:39:34.759,k-测试对象池,下标:0,list:0,活跃:2,空闲:6
K3[k]:2022-03-29 10:39:34.759,k-激活对象
K3[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
2022-03-29 10:39:53.075 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3,K3[k]:2022-03-29 10:39:34.759,k-测试对象池,下标:0,list:0,活跃:3,空闲:5
K4[k]:2022-03-29 10:39:34.759,k-激活对象
K4[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
2022-03-29 10:39:53.075 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4,K4[k]:2022-03-29 10:39:34.759,k-测试对象池,下标:0,list:0,活跃:4,空闲:4
K1[k]:2022-03-29 10:39:34.657,k-激活对象
K1[k]:2022-03-29 10:39:34.657,k-验证对象是否可用
2022-03-29 10:39:53.075 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1,K1[k]:2022-03-29 10:39:34.657,k-测试对象池,下标:1,list:1,活跃:5,空闲:3
K2[k]:2022-03-29 10:39:34.658,k-激活对象
K2[k]:2022-03-29 10:39:34.658,k-验证对象是否可用
2022-03-29 10:39:53.075 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2,K2[k]:2022-03-29 10:39:34.658,k-测试对象池,下标:1,list:1,活跃:6,空闲:2
K3[k]:2022-03-29 10:39:34.658,k-激活对象
K3[k]:2022-03-29 10:39:34.658,k-验证对象是否可用
2022-03-29 10:39:53.075 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3,K3[k]:2022-03-29 10:39:34.658,k-测试对象池,下标:1,list:1,活跃:7,空闲:1
K4[k]:2022-03-29 10:39:34.659,k-激活对象
K4[k]:2022-03-29 10:39:34.659,k-验证对象是否可用
2022-03-29 10:39:53.075 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4,K4[k]:2022-03-29 10:39:34.659,k-测试对象池,下标:1,list:1,活跃:8,空闲:0
K1[k]:2022-03-29 10:39:53.075,k-构建对象
K1[k]:2022-03-29 10:39:53.075,k-激活对象
K1[k]:2022-03-29 10:39:53.075,k-验证对象是否可用
2022-03-29 10:39:53.076 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1,K1[k]:2022-03-29 10:39:53.075,k-测试对象池,下标:2,list:2,活跃:9,空闲:0
K2[k]:2022-03-29 10:39:53.076,k-构建对象
K2[k]:2022-03-29 10:39:53.076,k-激活对象
K2[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.076 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2,K2[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:2,list:2,活跃:10,空闲:0
K3[k]:2022-03-29 10:39:53.076,k-构建对象
K3[k]:2022-03-29 10:39:53.076,k-激活对象
K3[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.076 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3,K3[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:2,list:2,活跃:11,空闲:0
K4[k]:2022-03-29 10:39:53.076,k-构建对象
K4[k]:2022-03-29 10:39:53.076,k-激活对象
K4[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.076 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4,K4[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:2,list:2,活跃:12,空闲:0
K1[k]:2022-03-29 10:39:53.076,k-构建对象
K1[k]:2022-03-29 10:39:53.076,k-激活对象
K1[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.076 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1,K1[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:3,list:3,活跃:13,空闲:0
K2[k]:2022-03-29 10:39:53.076,k-构建对象
K2[k]:2022-03-29 10:39:53.076,k-激活对象
K2[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.076 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2,K2[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:3,list:3,活跃:14,空闲:0
K3[k]:2022-03-29 10:39:53.076,k-构建对象
K3[k]:2022-03-29 10:39:53.076,k-激活对象
K3[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.076 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3,K3[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:3,list:3,活跃:15,空闲:0
K4[k]:2022-03-29 10:39:53.076,k-构建对象
K4[k]:2022-03-29 10:39:53.076,k-激活对象
K4[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.076 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4,K4[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:3,list:3,活跃:16,空闲:0
K1[k]:2022-03-29 10:39:53.077,k-构建对象
K1[k]:2022-03-29 10:39:53.077,k-激活对象
K1[k]:2022-03-29 10:39:53.077,k-验证对象是否可用
2022-03-29 10:39:53.077 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1,K1[k]:2022-03-29 10:39:53.077,k-测试对象池,下标:4,list:4,活跃:17,空闲:0
K2[k]:2022-03-29 10:39:53.077,k-构建对象
K2[k]:2022-03-29 10:39:53.077,k-激活对象
K2[k]:2022-03-29 10:39:53.077,k-验证对象是否可用
2022-03-29 10:39:53.077 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2,K2[k]:2022-03-29 10:39:53.077,k-测试对象池,下标:4,list:4,活跃:18,空闲:0
K3[k]:2022-03-29 10:39:53.077,k-构建对象
K3[k]:2022-03-29 10:39:53.077,k-激活对象
K3[k]:2022-03-29 10:39:53.077,k-验证对象是否可用
2022-03-29 10:39:53.077 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3,K3[k]:2022-03-29 10:39:53.077,k-测试对象池,下标:4,list:4,活跃:19,空闲:0
K4[k]:2022-03-29 10:39:53.077,k-构建对象
K4[k]:2022-03-29 10:39:53.077,k-激活对象
K4[k]:2022-03-29 10:39:53.077,k-验证对象是否可用
2022-03-29 10:39:53.077 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4,K4[k]:2022-03-29 10:39:53.077,k-测试对象池,下标:4,list:4,活跃:20,空闲:0
K1[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
K1[k]:2022-03-29 10:39:34.759,k-钝化一个对象
2022-03-29 10:39:53.077 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1[k]:2022-03-29 10:39:34.759,k-测试对象池,回收
K1[k]:2022-03-29 10:39:34.759,k-激活对象
K1[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
2022-03-29 10:39:53.077 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1,K1[k]:2022-03-29 10:39:34.759,k-测试对象池,下标:5,list:4,活跃:20,空闲:0
K2[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
K2[k]:2022-03-29 10:39:34.759,k-钝化一个对象
2022-03-29 10:39:53.077 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2[k]:2022-03-29 10:39:34.759,k-测试对象池,回收
K2[k]:2022-03-29 10:39:34.759,k-激活对象
K2[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2,K2[k]:2022-03-29 10:39:34.759,k-测试对象池,下标:5,list:4,活跃:20,空闲:0
K3[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
K3[k]:2022-03-29 10:39:34.759,k-钝化一个对象
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3[k]:2022-03-29 10:39:34.759,k-测试对象池,回收
K3[k]:2022-03-29 10:39:34.759,k-激活对象
K3[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3,K3[k]:2022-03-29 10:39:34.759,k-测试对象池,下标:5,list:4,活跃:20,空闲:0
K4[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
K4[k]:2022-03-29 10:39:34.759,k-钝化一个对象
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4[k]:2022-03-29 10:39:34.759,k-测试对象池,回收
K4[k]:2022-03-29 10:39:34.759,k-激活对象
K4[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4,K4[k]:2022-03-29 10:39:34.759,k-测试对象池,下标:5,list:4,活跃:20,空闲:0
K1[k]:2022-03-29 10:39:34.657,k-验证对象是否可用
K1[k]:2022-03-29 10:39:34.657,k-钝化一个对象
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1[k]:2022-03-29 10:39:34.657,k-测试对象池,回收
K1[k]:2022-03-29 10:39:34.657,k-激活对象
K1[k]:2022-03-29 10:39:34.657,k-验证对象是否可用
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1,K1[k]:2022-03-29 10:39:34.657,k-测试对象池,下标:6,list:4,活跃:20,空闲:0
K2[k]:2022-03-29 10:39:34.658,k-验证对象是否可用
K2[k]:2022-03-29 10:39:34.658,k-钝化一个对象
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2[k]:2022-03-29 10:39:34.658,k-测试对象池,回收
K2[k]:2022-03-29 10:39:34.658,k-激活对象
K2[k]:2022-03-29 10:39:34.658,k-验证对象是否可用
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2,K2[k]:2022-03-29 10:39:34.658,k-测试对象池,下标:6,list:4,活跃:20,空闲:0
K3[k]:2022-03-29 10:39:34.658,k-验证对象是否可用
K3[k]:2022-03-29 10:39:34.658,k-钝化一个对象
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3[k]:2022-03-29 10:39:34.658,k-测试对象池,回收
K3[k]:2022-03-29 10:39:34.658,k-激活对象
K3[k]:2022-03-29 10:39:34.658,k-验证对象是否可用
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3,K3[k]:2022-03-29 10:39:34.658,k-测试对象池,下标:6,list:4,活跃:20,空闲:0
K4[k]:2022-03-29 10:39:34.659,k-验证对象是否可用
K4[k]:2022-03-29 10:39:34.659,k-钝化一个对象
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4[k]:2022-03-29 10:39:34.659,k-测试对象池,回收
K4[k]:2022-03-29 10:39:34.659,k-激活对象
K4[k]:2022-03-29 10:39:34.659,k-验证对象是否可用
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4,K4[k]:2022-03-29 10:39:34.659,k-测试对象池,下标:6,list:4,活跃:20,空闲:0
K1[k]:2022-03-29 10:39:53.075,k-验证对象是否可用
K1[k]:2022-03-29 10:39:53.075,k-钝化一个对象
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1[k]:2022-03-29 10:39:53.075,k-测试对象池,回收
K1[k]:2022-03-29 10:39:53.075,k-激活对象
K1[k]:2022-03-29 10:39:53.075,k-验证对象是否可用
2022-03-29 10:39:53.078 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K1,K1[k]:2022-03-29 10:39:53.075,k-测试对象池,下标:7,list:4,活跃:20,空闲:0
K2[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K2[k]:2022-03-29 10:39:53.076,k-钝化一个对象
2022-03-29 10:39:53.079 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2[k]:2022-03-29 10:39:53.076,k-测试对象池,回收
K2[k]:2022-03-29 10:39:53.076,k-激活对象
K2[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.079 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K2,K2[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:7,list:4,活跃:20,空闲:0
K3[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K3[k]:2022-03-29 10:39:53.076,k-钝化一个对象
2022-03-29 10:39:53.079 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3[k]:2022-03-29 10:39:53.076,k-测试对象池,回收
K3[k]:2022-03-29 10:39:53.076,k-激活对象
K3[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.079 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K3,K3[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:7,list:4,活跃:20,空闲:0
K4[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K4[k]:2022-03-29 10:39:53.076,k-钝化一个对象
2022-03-29 10:39:53.079 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4[k]:2022-03-29 10:39:53.076,k-测试对象池,回收
K4[k]:2022-03-29 10:39:53.076,k-激活对象
K4[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
2022-03-29 10:39:53.079 INFO 20740 --- [http-nio-8125-exec-1] ***.TestController :
K4,K4[k]:2022-03-29 10:39:53.076,k-测试对象池,下标:7,list:4,活跃:20,空闲:0
K1[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K1[k]:2022-03-29 10:39:53.076,k-钝化一个对象
K1[k]:2022-03-29 10:39:53.077,k-验证对象是否可用
K1[k]:2022-03-29 10:39:53.077,k-钝化一个对象
K1[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
K1[k]:2022-03-29 10:39:34.759,k-钝化一个对象
K1[k]:2022-03-29 10:39:34.759,k-销毁对象
K1[k]:2022-03-29 10:39:34.759:销毁
K1[k]:2022-03-29 10:39:34.657,k-验证对象是否可用
K1[k]:2022-03-29 10:39:34.657,k-钝化一个对象
K1[k]:2022-03-29 10:39:34.657,k-销毁对象
K1[k]:2022-03-29 10:39:34.657:销毁
K1[k]:2022-03-29 10:39:53.075,k-验证对象是否可用
K1[k]:2022-03-29 10:39:53.075,k-钝化一个对象
K1[k]:2022-03-29 10:39:53.075,k-销毁对象
K1[k]:2022-03-29 10:39:53.075:销毁
K2[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K2[k]:2022-03-29 10:39:53.076,k-钝化一个对象
K2[k]:2022-03-29 10:39:53.077,k-验证对象是否可用
K2[k]:2022-03-29 10:39:53.077,k-钝化一个对象
K2[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
K2[k]:2022-03-29 10:39:34.759,k-钝化一个对象
K2[k]:2022-03-29 10:39:34.759,k-销毁对象
K2[k]:2022-03-29 10:39:34.759:销毁
K2[k]:2022-03-29 10:39:34.658,k-验证对象是否可用
K2[k]:2022-03-29 10:39:34.658,k-钝化一个对象
K2[k]:2022-03-29 10:39:34.658,k-销毁对象
K2[k]:2022-03-29 10:39:34.658:销毁
K2[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K2[k]:2022-03-29 10:39:53.076,k-钝化一个对象
K2[k]:2022-03-29 10:39:53.076,k-销毁对象
K2[k]:2022-03-29 10:39:53.076:销毁
K3[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K3[k]:2022-03-29 10:39:53.076,k-钝化一个对象
K3[k]:2022-03-29 10:39:53.077,k-验证对象是否可用
K3[k]:2022-03-29 10:39:53.077,k-钝化一个对象
K3[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
K3[k]:2022-03-29 10:39:34.759,k-钝化一个对象
K3[k]:2022-03-29 10:39:34.759,k-销毁对象
K3[k]:2022-03-29 10:39:34.759:销毁
K3[k]:2022-03-29 10:39:34.658,k-验证对象是否可用
K3[k]:2022-03-29 10:39:34.658,k-钝化一个对象
K3[k]:2022-03-29 10:39:34.658,k-销毁对象
K3[k]:2022-03-29 10:39:34.658:销毁
K3[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K3[k]:2022-03-29 10:39:53.076,k-钝化一个对象
K3[k]:2022-03-29 10:39:53.076,k-销毁对象
K3[k]:2022-03-29 10:39:53.076:销毁
K4[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K4[k]:2022-03-29 10:39:53.076,k-钝化一个对象
K4[k]:2022-03-29 10:39:53.077,k-验证对象是否可用
K4[k]:2022-03-29 10:39:53.077,k-钝化一个对象
K4[k]:2022-03-29 10:39:34.759,k-验证对象是否可用
K4[k]:2022-03-29 10:39:34.759,k-钝化一个对象
K4[k]:2022-03-29 10:39:34.759,k-销毁对象
K4[k]:2022-03-29 10:39:34.759:销毁
K4[k]:2022-03-29 10:39:34.659,k-验证对象是否可用
K4[k]:2022-03-29 10:39:34.659,k-钝化一个对象
K4[k]:2022-03-29 10:39:34.659,k-销毁对象
K4[k]:2022-03-29 10:39:34.659:销毁
K4[k]:2022-03-29 10:39:53.076,k-验证对象是否可用
K4[k]:2022-03-29 10:39:53.076,k-钝化一个对象
K4[k]:2022-03-29 10:39:53.076,k-销毁对象
K4[k]:2022-03-29 10:39:53.076:销毁
项目关闭日志
K1[k]:2022-03-29 10:39:53.077,k-销毁对象
K1[k]:2022-03-29 10:39:53.077:销毁
K1[k]:2022-03-29 10:39:53.076,k-销毁对象
K1[k]:2022-03-29 10:39:53.076:销毁
K2[k]:2022-03-29 10:39:53.077,k-销毁对象
K2[k]:2022-03-29 10:39:53.077:销毁
K2[k]:2022-03-29 10:39:53.076,k-销毁对象
K2[k]:2022-03-29 10:39:53.076:销毁
K3[k]:2022-03-29 10:39:53.077,k-销毁对象
K3[k]:2022-03-29 10:39:53.077:销毁
K3[k]:2022-03-29 10:39:53.076,k-销毁对象
K3[k]:2022-03-29 10:39:53.076:销毁
K4[k]:2022-03-29 10:39:53.077,k-销毁对象
K4[k]:2022-03-29 10:39:53.077:销毁
K4[k]:2022-03-29 10:39:53.076,k-销毁对象
K4[k]:2022-03-29 10:39:53.076:销毁
2022-03-29 10:39:53.073,销毁对象
2022-03-29 10:39:53.073:销毁
2022-03-29 10:39:53.072,销毁对象
2022-03-29 10:39:53.072:销毁
对象池关闭-start
对象池关闭-end
截图