使用GenericObjectPool和GenericObjectPoolConfig进行对象池管理

  • 通过GenericObjectPool和GenericObjectPoolConfig实现对象池的配置和管理,通常涉及以下几个关键步骤:
    • 创建GenericObjectPoolConfig实例并配置参数:这包括设置对象池的基本行为,如最大等待时间、空闲时测试、逐出策略等。
    • 定义对象工厂:创建一个工厂类,它继承自PooledObjectFactory接口,负责创建和销毁对象。
    • 创建GenericObjectPool实例:使用上述配置和工厂类实例化GenericObjectPool。

下面是一个具体的代码示例,展示如何使用Apache Commons Pool库中的GenericObjectPool和GenericObjectPoolConfig来创建一个简单的连接池:

如下代码示例是获取jdbc连接的示例

import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionPool {

    private final GenericObjectPool<Connection> connectionPool;

    public ConnectionPool(String url, String user, String password) {
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxTotal(10); // 设置最大连接数
        poolConfig.setMaxWaitMillis(5000); // 设置最大等待时间

        ConnectionFactory factory = new ConnectionFactory(url, user, password);

        connectionPool = new GenericObjectPool<>(factory, poolConfig);
    }

    public Connection getConnection() throws SQLException {
        try {
            return connectionPool.borrowObject();
        } catch (Exception e) {
            throw new SQLException("Error borrowing connection from pool", e);
        }
    }

    public void returnConnection(Connection conn) {
        try {
            connectionPool.returnObject(conn);
        } catch (Exception e) {
      
        }
    }

    static class ConnectionFactory extends BasePooledObjectFactory<Connection> {
        private final String url;
        private final String user;
        private final String password;

        public ConnectionFactory(String url, String user, String password) {
            this.url = url;
            this.user = user;
            this.password = password;
        }

        @Override
        public Connection create() throws Exception {
            return DriverManager.getConnection(url, user, password);
        }

        @Override
        public PooledObject<Connection> wrap(Connection connection) {
            return new DefaultPooledObject<>(connection);
        }
    }
}

在这个示例中,ConnectionFactory类负责创建数据库连接,而GenericObjectPool则负责管理这些连接的生命周期,包括借用、归还和销毁。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用对象池对代码进行优化,避免频繁地创建和销毁对象,提高程序的性能。下面是优化后的代码: ``` @Data public class PropertiesMessage implements Serializable { private Map<String, DeviceProperties> propertiesMap; } @Data public class DeviceProperties implements Serializable { private String value; } @AllArgsConstructor public class StorageConfig { private String value; } @AllArgsConstructor(onConstructor = @__({@Autowired})) public class StorageListen { private static final int POOL_SIZE = 10; private static final ObjectPool<PropertiesMessage> propertiesMessagePool = new GenericObjectPool<>(new PropertiesMessageFactory()); private static final ObjectPool<DeviceProperties> devicePropertiesPool = new GenericObjectPool<>(new DevicePropertiesFactory()); private PeriodStorage periodStorage; @Scheduled(cron="*/1 * * * * ?") @Async("PeriodStorage") public void periodStorage() throws Exception { PropertiesMessage propertiesMessage = propertiesMessagePool.borrowObject(); Map<String, List<StorageConfig>> map = new HashMap<>(); List<StorageConfig> list = new ArrayList<>(); StorageConfig s1 = new StorageConfig(); s1.setValue("1"); StorageConfig s2 = new StorageConfig(); s2.setValue("1"); list.add(s1); list.add(s2); map.put("1", list); periodStorage.storageData(propertiesMessage, map); propertiesMessagePool.returnObject(propertiesMessage); } private static class PropertiesMessageFactory extends BasePooledObjectFactory<PropertiesMessage> { @Override public PropertiesMessage create() { return new PropertiesMessage(); } @Override public PooledObject<PropertiesMessage> wrap(PropertiesMessage propertiesMessage) { return new DefaultPooledObject<>(propertiesMessage); } } @AllArgsConstructor private static class DevicePropertiesFactory extends BasePooledObjectFactory<DeviceProperties> { @Override public DeviceProperties create() { return new DeviceProperties(); } @Override public PooledObject<DeviceProperties> wrap(DeviceProperties deviceProperties) { return new DefaultPooledObject<>(deviceProperties); } } } @AllArgsConstructor(onConstructor = @__({@Autowired})) public class PeriodStorage { private static final ObjectPool<DeviceProperties> devicePropertiesPool = new GenericObjectPool<>(new DevicePropertiesFactory()); public void storageData(PropertiesMessage message, Map<String, List<StorageConfig>> map) throws Exception { map.entrySet().stream().forEach(k -> { k.getValue().parallelStream().forEach(y -> { DeviceProperties deviceProperties = null; try { deviceProperties = devicePropertiesPool.borrowObject(); System.out.println(y.toString()); System.out.println(deviceProperties.toString()); } catch (Exception e) { e.printStackTrace(); } finally { if (deviceProperties != null) { devicePropertiesPool.returnObject(deviceProperties); } } }); }); } private static class DevicePropertiesFactory extends BasePooledObjectFactory<DeviceProperties> { @Override public DeviceProperties create() { return new DeviceProperties(); } @Override public PooledObject<DeviceProperties> wrap(DeviceProperties deviceProperties) { return new DefaultPooledObject<>(deviceProperties); } } } ``` 优化后的代码使用了Apache Common Pool2提供的对象池管理PropertiesMessage和DeviceProperties对象。在StorageListen类中,定义了一个大小为10的PropertiesMessage对象池和一个大小为10的DeviceProperties对象池。在periodStorage方法中,从PropertiesMessage对象池中借用一个对象,然后调用periodStorage对象的storageData方法,并在方法执行完成后将对象还回对象池。在PeriodStorage类中,定义了一个大小为10的DeviceProperties对象池,每次需要使用DeviceProperties对象时从对象池中借用一个对象,使用完成后将对象还回对象池。这样就避免了频繁地创建和销毁对象,提高了程序的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值