SpringBoot设计对象池的那些事commons-pool2工具(注意事项)

背景:

       现在开发过程中需要一个需求,那就是使用SpringBoot采用的是原生的单例模式进行设计,哪个类需要复用就直接将其注解注入容器,下次使用的时候直接进行@Autowired注入就可以了,很是方便。但是这种单例模式并不是适合所有的场景,

如果该类涉及到全局变量或者其他的可能调用修改一个地方而影响其他地方使用的时候,就非常的不安全,还有就是如果要保持tcp多个连接提高性能的话也是需要进行优化的,下面我们就针对这个问题,可以采用对象池的方式进行优化,也就是我们

的处理连接可以有多个连接同时处理提高性能。 

1.  首先我们采用的是Apache的pool对象池的方式,这种方式就是将你需要初始化多少的对象进行配置化生成,使用后进行归还,便于下次的使用。我是参考下面的链接进行开发的给常好用:

https://www.cnblogs.com/durenniu/archive/2004/01/13/12616802.html

2. 采用Apache对象池需要了解的基本的配置,具体如下,可能版本不同名称会有所修改,但是基本改动不大:

3. Apache的对象池在设计中遇到的一些优化问题(重点):

      1) 第一点就是在设计中要对象化的类在写构造函数的时候,如果涉及到需要获取配置文件的信息时候,如果单纯的通过之前SpringBoot的方式是获取不到的。

   @Autowired
  Application application;

上面这种方式在开发中如果是在非容器注解的类中是获取不到的,所以我这边的设计方式是,在写Pool对象池生成对象那部分读取配置文件然后放到缓存Map中,这种方式,在任何地方都可以获取到相关的信息数据。

简单的来说,你可以在你是要的Apache对象池生成过程中可以获取到配置文件的地方进行获取配置,然后存放在Map缓存中。(一定要在生成对象前进行存入,否则读取为空),我是在 PoolAutoConfiguration类文件中进行存入的。

  2) 关于配置文件设置Apache对象池的设计,开始我的设计就是需要哪些信息就将什么信息放在配置文件,但是如果是有新的配置信息,我需要修改代码进行重新的@Value对应的值,这种方式,表面上是可以,但是添加一个

2中的基本配置就需要修改代码,比较浪费开发时间,最后选择的优化方式如下:下图为我当前的配置,后期可能会按照2中的配置进行添加。

修改的方式就是: 采用@Value("${配置名称:默认值}") 具体参考如下,也就是在写代码的时候先按照2中的配置说明,将所有的情况进行注入,然后给默认值,默认值就是Apache文档中的值,这样我们在获取的时候,可以动态的添加配置文件,不需要修改代码。

   3) 最后一点也就是中重要的,那就是性能优化的问题,因为我们当前使用的对象池假设初始化10个对象,但是并发请求20次的时候,可能会存在获取不到对象报Pool耗尽的异常,这个时候我们要么进行设置等待时间,要么进行设计耗尽策略,

等待时间方案太简单了,就不讲解了,具体就是设置配置文件就可以了,关于耗尽策略我的设计是在请求的时候我们先将一个获取的对象池对象放在Map缓存中,每次请求对象还是之前的方式,只是在抛异常Pool耗尽的地方进行处理,通过缓存中获取该对象,简单的理解就是

这个Map缓存充当单例模式,也就是说,优化的效果就是对象池+单例模式。而且是优先对象池,Pool耗尽的时候才使用单例模式的值进行复用连接。

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于构建Java应用程序的开发框架,而Apache Commons Pool是一个开源的对象池实现工具。在Spring Boot中整合Apache Commons Pool可以帮助我们更方便地管理对象的创建和销毁,提高系统的性能和可扩展性。 首先,我们需要在pom.xml文件中添加commons-pool2的依赖。在Spring Boot的起步依赖中已经包含了commons-pool2的支持,因此只需指定对应的版本即可。 接下来,在Spring Boot的配置文件中配置对象池的相关信息。可以使用@ConfigurationProperties注解来配置我们需要的参数,如最大对象数、最小空闲对象数、对象的生存时间等。通过这些配置,我们可以根据系统的需求来灵活地调整对象池的表现方式。 然后,在Spring Boot的配置类中将对象池配置为一个Bean。可以使用@Bean注解来声明一个对象池的实例,并通过配置文件中的参数来初始化它。可以根据需要选择不同的类型的对象池,如基本对象池、通道对象池、连接池等。同时,我们还可以在@Bean注解中指定对象池的名称,以便在其他地方注入使用。 最后,在需要使用对象池的地方注入使用。可以使用@Autowired注解将对象池注入到需要使用的类中。通过调用对象池的相关方法,如borrowObject()和returnObject()方法来获取和归还对象。这样,我们就可以通过对象池来重复利用已经创建的对象,提高系统的性能和效率。 总之,通过Spring Boot整合commons-pool2,我们可以更方便地管理和使用对象池,提供了一种高效、可扩展的方式来管理对象的创建和销毁,有助于提升系统的性能和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值