背景:
现在开发过程中需要一个需求,那就是使用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耗尽的时候才使用单例模式的值进行复用连接。