设计模式——对象池模式

news/2024/9/20 1:15:27 标签: 设计模式, oracle, 数据库

对象池模式

        • 1. 概述
        • 2. 适用场景
        • 3. 原理
        • 4. 优点
        • 5. 缺点
      • 示例代码
        • 示例代码
        • 使用示例
      • Java 标准库中的例子
        • Apache Commons Pool 示例

1. 概述

对象池模式(Object Pool Pattern) 是一种用于管理和复用一组预先创建的对象的设计模式。它的主要目的是为了提高性能和节省资源。当创建对象成本较高,而对象使用频率不高时,对象池可以有效地减少创建和销毁对象的次数,从而提高性能。

2. 适用场景
  • 数据库连接管理数据库连接的建立和断开是昂贵的操作。
  • 图形处理中的对象复用:在图形处理中,创建和销毁图形对象也是耗时的操作。
  • 线程管理:创建新线程同样代价高昂,因此可以使用线程池来管理线程。
3. 原理

对象池模式的核心思想是在系统初始化期间创建一定数量的对象,并将它们保存在一个池中。当需要使用这些对象时,从池中获取;当用完后,不是立即销毁对象,而是将其归还给池,以便后续使用。

4. 优点
  • 减少创建和销毁对象的成本:通过重复使用已有的对象,减少了创建新对象所需的资源消耗。
  • 提高响应速度:对象已经准备好使用,无需等待构造函数的执行。
5. 缺点
  • 增加了系统的复杂性:引入对象池会增加系统的复杂性,需要管理对象的创建、回收等。
  • 对象状态管理:需要确保对象在被重新使用之前处于正确的状态。

示例代码

接下来是一个简单的对象池模式实现示例,创建一个线程安全的对象池来管理Connection对象。

示例代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class ConnectionPool {
    private BlockingQueue<Connection> pool;
    private final int maxConnections;

    public ConnectionPool(int maxConnections) {
        this.maxConnections = maxConnections;
        pool = new LinkedBlockingQueue<>(maxConnections);
        initializePool(maxConnections);
    }

    private void initializePool(int maxConnections) {
        try {
            for (int i = 0; i < maxConnections; i++) {
                Connection conn = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/testdb",
                        "root", "password"
                );
                pool.put(conn);
            }
        } catch (InterruptedException | SQLException e) {
            e.printStackTrace();
        }
    }

    public Connection getConnection() throws InterruptedException {
        return pool.take();
    }

    public void releaseConnection(Connection connection) {
        if (connection != null) {
            try {
                pool.put(connection);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
使用示例
public class Main {
    public static void main(String[] args) {
        ConnectionPool pool = new ConnectionPool(10);

        // 获取连接
        try (Connection conn = pool.getConnection()) {
            // 使用连接...
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            pool.releaseConnection(conn);
        }
    }
}

Java 标准库中的例子

Java 标准库中有一些类和接口可以用来实现类似的功能,例如 java.util.concurrent 包中的 BlockingQueue 接口,它可以用来作为对象池的底层数据结构。此外,Apache Commons Pool库提供了一种通用的对象池实现,可以用于多种类型的对象。

Apache Commons Pool 示例

下面是一个使用Commons Pool实现的简单示例:

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;

public class SimpleObjectPool<T> extends GenericObjectPool<T> {
    public SimpleObjectPool(BasePooledObjectFactory<T> factory) {
        super(factory);
    }
}

class SimpleObjectFactory<T> extends BasePooledObjectFactory<T> {
    @Override
    public T create() throws Exception {
        // 创建对象逻辑
        return null;
    }

    @Override
    public PooledObject<T> wrap(T obj) {
        return new DefaultPooledObject<>(obj);
    }
}

// 使用示例
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
SimpleObjectPool<MyObject> pool = new SimpleObjectPool<>(new SimpleObjectFactory<>(), config);

这个示例展示了如何使用Commons Pool创建一个泛型对象池,并提供了创建和包装对象的基本方法。


http://www.niftyadmin.cn/n/5666428.html

相关文章

leetcode41. 缺失的第一个正数,原地哈希表

leetcode41. 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xf…

keil调试变量值被篡改问题

今天遇到一个代码中变量值被篡改的问题&#xff0c;某个数组的第一个值运行一段时间之后变成了0&#xff0c;如图&#xff1a; 看现象基本可以断定是内存越界导致的&#xff0c;但是要如果定位是哪里内存越界呢? keil提供了两个工具 1、set access breakpoint at(设置访问断点…

面试官:什么是CAS?存在什么问题?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 CAS&#xff0c;Compare And Swap&#xff0c;即比较并交换&#xff0c;它一种无锁编程技术的核心机制。其工作方式分为两步&#xff1a; 比较&#xff1a;它首先会比较内存中的某…

卷积和转置卷积的输出尺寸计算

卷积和转置卷积的输出尺寸计算 卷积 h是输出的高&#xff0c;h是输入的高&#xff0c;k_h是卷积核的高 w类似stride1 h h - k_h padding*2 1通用公式 stride1就是上面的公式 h (h - k_w 2*padding stride)//stride 一些常见的卷积 高宽不变的卷积&#xff1a;kernel…

智能会计定义

管理会计的发展离不开与信息技术的融合。信息化是支持管理会计理念与方法落地&#xff0c;支撑管理会计功能发挥和价值实现的重要手段和推动力量。将信息技术应用到管理会计领域&#xff0c;可以有效突破传统管理会计在时间空间上的限制&#xff0c;深入挖掘企业各个流程的相关…

攻防世界--->crackme

做题笔记。 下载 查壳。 OK&#xff0c;压缩壳。 额&#xff0c;reverse肯定是需要掌握手动脱壳的&#xff0c;而不能一直依赖脱壳机。 手动脱壳。 可以用Ollydbg LoadPE ImportREC 实现 脱壳 dump 修补表 得到最终脱壳的.exe 不过&#xff0c;挺麻烦的(我反正 LoadPE Impo…

Zabbix 部署----安装Zabbix(业务主机)

目录 1、另外准备一台虚拟机(192.xx.xx.20) 设置主机名 关闭防火墙、selinux 准备zabbix-repo 安装zabbix-agent 配置主服务器地址 启动zabbix-agent&#xff1a;10050 1、另外准备一台虚拟机(192.xx.xx.20) 设置主机名 hostname web1 关闭防火墙、selinux syst…

钢铁焦化水泥超低排放标准最新规定

钢铁、焦化、水泥行业的超低排放标准最新规定&#xff0c;是随着环保政策的不断升级而逐步完善的。以下是朗观视觉小编&#xff0c;根据最新政策文件和相关资料整理的各行业的超低排放标准&#xff1a; 一、钢铁行业 钢铁行业的超低排放标准主要关注有组织排放控制指标&#x…