我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java GenericObjectPool对象池化技术怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java GenericObjectPool对象池化技术怎么使用

这篇文章主要介绍了Java GenericObjectPool对象池化技术怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java GenericObjectPool对象池化技术怎么使用文章都会有所收获,下面我们一起来看看吧。

Java BasePooledObjectFactory 对象池化技术

通常一个对象创建、销毁非常耗时的时候,我们不会频繁的创建和销毁它,而是考虑复用。复用对象的一种做法就是对象池,将创建好的对象放入池中维护起来,下次再用的时候直接拿池中已经创建好的对象继续用,这就是池化的思想。

Apache Commons Pool是一个对象池的框架,他提供了一整套用于实现对象池化的API。它提供了三种对象池:GenericKeyedObjectPool,SoftReferenceObjectPool和GenericObjectPool,其中GenericObjectPool是我们最常用的对象池,内部实现也最复杂。

GenericObjectPool

GenericObjectPool 是一个通用对象池框架,我们可以借助它实现一个健壮的对象池,UML图如下所示:

Java GenericObjectPool对象池化技术怎么使用

GenericObjectPool 实现了ObjectPool接口,而ObjectPool就是对象池的核心接口,它定义了一个对象池应该实现的行为。

public interface ObjectPool<T> extends Closeable {        T borrowObject() throws Exception, NoSuchElementException, IllegalStateException;        void returnObject(T var1) throws Exception;        void invalidateObject(T var1) throws Exception;        void addObject() throws Exception, IllegalStateException, UnsupportedOperationException;        int getNumIdle();        int getNumActive();        void clear() throws Exception, UnsupportedOperationException;        void close();}

BasePooledObjectFactory

Java BasePooledObjectFactory 对象池化技术

使用GenericObjectPool只需要创建一个对象工厂类,继承BasePooledObjectFactory并重写它的create()destroyObject()
如下文中的:SftpPool.java

public interface PooledObjectFactory<T> {        PooledObject<T> makeObject() throws Exception;        void destroyObject(PooledObject<T> var1) throws Exception;        boolean validateObject(PooledObject<T> var1);        void activateObject(PooledObject<T> var1) throws Exception;        void passivateObject(PooledObject<T> var1) throws Exception;}

配置类GenericObjectPoolConfig

GenericObjectPoolConfig是封装GenericObject池配置的简单“结构”,此类不是线程安全的;它仅用于提供创建池时使用的属性。大多数情况,可以使用GenericObjectPoolConfig提供的默认参数就可以满足日常的需求。

工作原理流程

  • 构造方法
    当我们执行构造方法时,主要工作就是创建了一个存储对象的LinkedList类型容器,也就是概念意义上的“池”

  • 从对象池中获取对象
    获取池中的对象是通过borrowObject()命令,源码比较复杂,简单而言就是去LinkedList中获取一个对象,如果不存在的话,要调用构造方法中第一个参数Factory工厂类的makeObject()方法去创建一个对象再获取,获取到对象后要调用validateObject方法判断该对象是否是可用的,如果是可用的才拿去使用。LinkedList容器减一

  • 归还对象到线程池
    简单而言就是先调用validateObject方法判断该对象是否是可用的,如果可用则归还到池中,LinkedList容器加一,如果是不可以的则调用destroyObject方法进行销毁

上面三步就是最简单的流程,由于取和还的流程步骤都在borrowObject和returnObject方法中固定的,所以我们只要重写Factory工厂类的makeObject()和validateObject以及destroyObject方法即可实现最简单的池的管理控制,通过构造方法传入该Factory工厂类对象则可以创建最简单的对象池管理类。这算是比较好的解耦设计模式,借和还的流程如下图所示:

Java GenericObjectPool对象池化技术怎么使用

使用Demo

<dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-pool2</artifactId>    <version>2.7.0</version></dependency><!-- https://mvnrepository.com/artifact/com.jcraft/jsch --><dependency>    <groupId>com.jcraft</groupId>    <artifactId>jsch</artifactId>    <version>0.1.55</version></dependency>
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>vipsoft-parent</artifactId>        <groupId>com.vipsoft.boot</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>vipsoft-sftp</artifactId>    <version>1.0-SNAPSHOT</version>    <dependencies>        <dependency>            <groupId>org.apache.commons</groupId>            <artifactId>commons-pool2</artifactId>            <version>2.7.0</version>        </dependency>        <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->        <dependency>            <groupId>com.jcraft</groupId>            <artifactId>jsch</artifactId>            <version>0.1.55</version>        </dependency>        <dependency>            <groupId>org.eclipse.paho</groupId>            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>            <version>1.2.5</version>        </dependency>        <dependency>            <groupId>cn.hutool</groupId>            <artifactId>hutool-all</artifactId>            <version>5.3.6</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>            <exclusions>                <exclusion>                    <groupId>org.junit.vintage</groupId>                    <artifactId>junit-vintage-engine</artifactId>                </exclusion>            </exclusions>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

application.yaml

server:  port: 8088  application:    name: sftp Demosftp:  host: 172.16.3.88 # 服务器ip  port: 22 # ssh端口  username: root # 用户名  password: root # 密码  # 连接池参数  pool:    max-total: 10    max-idle: 10    min-idle: 5

SftpPoolException.java

package com.vipsoft.sftp.exception;public class SftpPoolException extends RuntimeException {    private static final long serialVersionUID = 1L;        public SftpPoolException() {    }        public SftpPoolException(String message) {        super(message);    }        public SftpPoolException(String message, Throwable cause) {        super(message, cause);    }        public SftpPoolException(Throwable cause) {        super(cause);    }        public SftpPoolException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {        super(message, cause, enableSuppression, writableStackTrace);    }}
config

SftpConfig.java

package com.vipsoft.sftp.config;import com.vipsoft.sftp.pool.SftpFactory;import com.vipsoft.sftp.pool.SftpPool;import com.vipsoft.sftp.utils.SftpUtil;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration@EnableConfigurationProperties(SftpProperties.class)public class SftpConfig {    // 工厂    @Bean    public SftpFactory sftpFactory(SftpProperties properties) {        return new SftpFactory(properties);    }    // 连接池    @Bean    public SftpPool sftpPool(SftpFactory sftpFactory) {        return new SftpPool(sftpFactory);    }    // 辅助类    @Bean    public SftpUtil sftpUtil(SftpPool sftpPool) {        return new SftpUtil(sftpPool);    }}

SftpProperties.java

package com.vipsoft.sftp.config;import com.jcraft.jsch.ChannelSftp;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "sftp")public class SftpProperties {    private String host;    private int port = 22;    private String username = "root";    private String password = "root";    private Pool pool = new Pool();    public String getHost() {        return host;    }    public void setHost(String host) {        this.host = host;    }    public int getPort() {        return port;    }    public void setPort(int port) {        this.port = port;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public Pool getPool() {        return pool;    }    public void setPool(Pool pool) {        this.pool = pool;    }    public static class Pool extends GenericObjectPoolConfig<ChannelSftp> {        private int maxTotal = DEFAULT_MAX_TOTAL;        private int maxIdle = DEFAULT_MAX_IDLE;        private int minIdle = DEFAULT_MIN_IDLE;        public Pool() {            super();        }        @Override        public int getMaxTotal() {            return maxTotal;        }        @Override        public void setMaxTotal(int maxTotal) {            this.maxTotal = maxTotal;        }        @Override        public int getMaxIdle() {            return maxIdle;        }        @Override        public void setMaxIdle(int maxIdle) {            this.maxIdle = maxIdle;        }        @Override        public int getMinIdle() {            return minIdle;        }        @Override        public void setMinIdle(int minIdle) {            this.minIdle = minIdle;        }    }}
Pool

SftpFactory.java

package com.vipsoft.sftp.pool;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;import com.vipsoft.sftp.config.SftpProperties;import com.vipsoft.sftp.exception.SftpPoolException;import org.apache.commons.pool2.BasePooledObjectFactory;import org.apache.commons.pool2.PooledObject;import org.apache.commons.pool2.impl.DefaultPooledObject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Properties;public class SftpFactory extends BasePooledObjectFactory<ChannelSftp> {    private  final Logger logger = LoggerFactory.getLogger(this.getClass());    private SftpProperties properties;    public SftpProperties getProperties() {        return properties;    }    public void setProperties(SftpProperties properties) {        this.properties = properties;    }    public SftpFactory(SftpProperties properties) {        this.properties = properties;    }    @Override    public ChannelSftp create() {        try {            JSch jsch = new JSch();            Session sshSession = jsch.getSession(properties.getUsername(), properties.getHost(), properties.getPort());            sshSession.setPassword(properties.getPassword());            Properties sshConfig = new Properties();            sshConfig.put("StrictHostKeyChecking", "no");            sshSession.setConfig(sshConfig);            sshSession.connect();            ChannelSftp channel = (ChannelSftp) sshSession.openChannel("sftp");            channel.connect();            return channel;        } catch (JSchException e) {            throw new SftpPoolException("连接sfpt失败", e);        }    }    @Override    public PooledObject<ChannelSftp> wrap(ChannelSftp channelSftp) {        return new DefaultPooledObject<>(channelSftp);    }    // 销毁对象    @Override    public void destroyObject(PooledObject<ChannelSftp> p) {        ChannelSftp channelSftp = p.getObject();        channelSftp.disconnect();    }}

SftpPool.java

package com.vipsoft.sftp.pool;import com.jcraft.jsch.ChannelSftp;import org.apache.commons.pool2.impl.GenericObjectPool;public class SftpPool<T> extends GenericObjectPool<ChannelSftp> {    public SftpPool(SftpFactory factory) {        super(factory,factory.getProperties().getPool());    }        @Override    public ChannelSftp borrowObject() throws Exception {        return super.borrowObject();    }        @Override    public void returnObject(ChannelSftp channelSftp) {        if (channelSftp!=null) {            super.returnObject(channelSftp);        }    }}
Utils

ByteUtil.java

package com.vipsoft.sftp.utils;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.SftpException;import com.vipsoft.sftp.exception.SftpPoolException;import com.vipsoft.sftp.pool.SftpPool;import java.io.InputStream;public class SftpUtil {    private SftpPool pool;    public SftpUtil(SftpPool pool) {        this.pool = pool;    }        public byte[] download(String dir, String name) {        ChannelSftp sftp = null;        try {            sftp = pool.borrowObject();            sftp.cd(dir);            InputStream in = sftp.get(name);            return ByteUtil.inputStreamToByteArray(in);        } catch (Exception e) {            throw new SftpPoolException("sftp下载文件出错", e);        } finally {            pool.returnObject(sftp);        }    }        public void upload(String dir, String name, InputStream in) {        ChannelSftp sftp = null;        try {            sftp = pool.borrowObject();            mkdirs(sftp, dir);            sftp.cd(dir);            sftp.put(in, name);        } catch (Exception e) {            throw new SftpPoolException("sftp上传文件出错", e);        } finally {            pool.returnObject(sftp);        }    }        public void delete(String dir, String name) {        ChannelSftp sftp = null;        try {            sftp = pool.borrowObject();            sftp.cd(dir);            sftp.rm(name);        } catch (Exception e) {            throw new SftpPoolException("sftp删除文件出错", e);        } finally {            pool.returnObject(sftp);        }    }        private void mkdirs(ChannelSftp sftp, String dir) {        String[] folders = dir.split("/");        try {            sftp.cd("/");            for (String folder : folders) {                if (folder.length() > 0) {                    try {                        sftp.cd(folder);                    } catch (Exception e) {                        sftp.mkdir(folder);                        sftp.cd(folder);                    }                }            }        } catch (SftpException e) {            throw new SftpPoolException("sftp创建目录出错", e);        }    }}
Test

SftpTest.java

package com.vipsoft.sftp;import com.vipsoft.sftp.utils.SftpUtil;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestpublic class SftpTest {    @Autowired    private SftpUtil sftpUtil;    @Test    void downloadTest() {        byte[] dockerfiles = sftpUtil.download("/opt/demo/", "Dockerfile");        System.out.println("FileSize =>" + dockerfiles.length);    }}

Java GenericObjectPool对象池化技术怎么使用

关于“Java GenericObjectPool对象池化技术怎么使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java GenericObjectPool对象池化技术怎么使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java GenericObjectPool对象池化技术怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java GenericObjectPool对象池化技术怎么使用

这篇文章主要介绍了Java GenericObjectPool对象池化技术怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java GenericObjectPool对象池化技术怎么使用文章都会有所收获,
2023-07-05

Java GenericObjectPool 对象池化技术之SpringBoot sftp 连接池工具类详解

这篇文章主要介绍了Java GenericObjectPool 对象池化技术之SpringBoot sftp 连接池工具类详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-14

Java BasePooledObjectFactory 对象池化技术的使用

这篇文章主要介绍了Java BasePooledObjectFactory 对象池化技术,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-14

Java BasePooledObjectFactory对象池化技术如何使用

本篇内容主要讲解“Java BasePooledObjectFactory对象池化技术如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java BasePooledObjectFactor
2023-07-05

Java中的对象池怎么使用

本文小编为大家详细介绍“Java中的对象池怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的对象池怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 什么是对象池对象池,顾名思义就是一定
2023-07-05

怎么使用CocosCreator对象池

本篇文章给大家分享的是有关怎么使用CocosCreator对象池,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体操作第一步:准备好 Prefab把你想要创建的节点事先设置好并
2023-06-14

高效的Python通用对象池化库怎么使用

本篇内容主要讲解“高效的Python通用对象池化库怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“高效的Python通用对象池化库怎么使用”吧!对象池模式主要适用于以下应用场景:资源受限的
2023-07-06

Python3面向对象技术怎么用

本文小编为大家详细介绍“Python3面向对象技术怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python3面向对象技术怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。面向对象主要有三个特征:封装,
2023-06-27

怎么深度剖析C++对象池自动回收技术实现

本篇文章为大家展示了怎么深度剖析C++对象池自动回收技术实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效。对象
2023-06-17

golang对象池在网络中怎么使用

在网络编程中,可以使用golang的对象池来管理网络连接对象,以提高资源的复用和性能。首先,你需要定义一个对象池结构体,用来管理连接对象的创建和回收:type ConnectionPool struct {pool chan *Conn
2023-10-26

怎么使用java构造方法初始化对象

在Java中,可以使用构造方法来初始化对象。构造方法是一种特殊的方法,用于创建和初始化对象。构造方法的名称必须与类名相同,没有返回类型(包括void类型),并且在创建对象时自动调用。以下是使用Java构造方法初始化对象的步骤:1. 在类中定
2023-09-01

Java缓存技术怎么使用

这篇文章主要介绍“Java缓存技术怎么使用”,在日常操作中,相信很多人在Java缓存技术怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java缓存技术怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-05

Java Web HttpServletResponse对象怎么使用

本篇内容主要讲解“Java Web HttpServletResponse对象怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Web HttpServletResponse对象怎
2023-06-29

java redis对象锁怎么使用

JavaRedis对象锁是一种分布式锁机制,用于协调对共享资源的并发访问。它使用Redis的原子性命令来实现,确保只有单个客户端一次持有锁。客户端使用SETNX命令尝试设置锁键,使用EXPIRE命令设置超时时间,在超时时间内持有锁,使用DEL命令显式释放锁。该锁具有分布式、原子性、超时机制和简单易用等优势,但需要注意确保在释放锁之前清除超时,避免死锁,同时考虑使用分布式协调器或第三方库以提高鲁棒性。
java redis对象锁怎么使用
2024-04-02

Java中JSP的pageContext对象和page对象怎么使用

这篇文章主要讲解了“Java中JSP的pageContext对象和page对象怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中JSP的pageContext对象和page对象
2023-07-05

Keras中怎么使用正则化技术

在Keras中使用正则化技术可以通过在层中设置kernel_regularizer参数来实现。具体步骤如下:导入所需的库:from keras.models import Sequentialfrom keras.layers impor
Keras中怎么使用正则化技术
2024-03-07

java中间件技术怎么使用

Java中间件技术是一种用于帮助开发人员构建分布式应用程序的工具。它们提供了一系列功能和工具,用于处理分布式系统中的通信、事务、负载均衡等问题。使用Java中间件技术可以按照以下步骤进行:1.选择合适的中间件技术:Java中间件技术有很
2023-10-25

Java中JSP的session对象和config对象怎么使用

本篇内容主要讲解“Java中JSP的session对象和config对象怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中JSP的session对象和config对象怎么使用”吧!
2023-07-04

Java Scala面向对象怎么使用

今天小编给大家分享一下Java Scala面向对象怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Scala包:基础语
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录