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对象池的使用
jdk(java)8 日期格式化工具-使用枚举处理
list或数组转map代码-demo
public static final String[] KEYS = {"K1","K2","K3","K4"};
Map<String, ArrayList<TestObject>> map = Stream.of(KEYS)
.collect(Collectors.toMap(String::trim,k->new ArrayList<>(size),(k1, k2) -> k1));
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;
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;
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);
}
}
方案2-对象池
package ***.pools;
import org.apache.commons.pool2.KeyedPooledObjectFactory;
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
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;
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;
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;
@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;
private int maxIdleKey = 2;
private int maxTotalKey = 5;
private int minIdleKey = 0;
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;
@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<>();
config.setMaxTotal(testPoolProperties.getMaxTotal());
config.setMaxIdle(testPoolProperties.getMaxIdle());
config.setMinIdle(testPoolProperties.getMinIdle());
config.setBlockWhenExhausted(true);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
config.setTestWhileIdle(true);
config.setTimeBetweenEvictionRunsMillis(1000*60*30);
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);
}
}
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<>();
config.setMaxTotal(testPoolProperties.getMaxTotalKey()*KEYS.length);
config.setMaxTotalPerKey(testPoolProperties.getMaxTotalKey());
config.setMaxIdlePerKey(testPoolProperties.getMaxIdleKey());
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;
@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);
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
截图
       
|