commons-pool2(2.6.2)实现对象池-jdk8

29 篇文章 0 订阅
13 篇文章 0 订阅

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
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

截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对上述代码,我们可以使用commons-pool2提供的对象池进行修改。具体实现步骤如下: 1. 引入commons-pool2的依赖包,例如在Maven项目中,在pom.xml文件中添加以下代码: ``` <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.11.1</version> </dependency> ``` 2. 创建一个连接池对象,用于管理HttpClients对象的创建和回收: ```java GenericObjectPool<CloseableHttpClient> httpClientPool = new GenericObjectPool<>(new HttpClientFactory()); ``` 其中,HttpClientFactory是一个实现PooledObjectFactory接口的类,用于创建和销毁HttpClients对象。具体实现可以参考下面的代码: ```java public class HttpClientFactory implements PooledObjectFactory<CloseableHttpClient> { @Override public PooledObject<CloseableHttpClient> makeObject() throws Exception { return new DefaultPooledObject<>(HttpClients.createDefault()); } @Override public void destroyObject(PooledObject<CloseableHttpClient> pooledObject) throws Exception { CloseableHttpClient httpClient = pooledObject.getObject(); httpClient.close(); } @Override public boolean validateObject(PooledObject<CloseableHttpClient> pooledObject) { CloseableHttpClient httpClient = pooledObject.getObject(); return httpClient != null && httpClient.getConnectionManager().isShutdown(); } @Override public void activateObject(PooledObject<CloseableHttpClient> pooledObject) throws Exception { // do nothing } @Override public void passivateObject(PooledObject<CloseableHttpClient> pooledObject) throws Exception { // do nothing } } ``` 3. 使用连接池对象获取HttpClients对象,例如: ```java CloseableHttpClient httpClient = httpClientPool.borrowObject(); ``` 4. 使用完HttpClients对象后,将其归还给连接池: ```java httpClientPool.returnObject(httpClient); ``` 通过上述步骤,我们就可以使用commons-pool2提供的对象池来管理HttpClients对象的创建和回收了。这样可以大大减少对象的创建和销毁次数,提高程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值