CURD一时爽,故障来了火葬场。作为一个软件开发者,除了要能够应对业务功能需求之外,掌握一些优化方法和应用场景是一道必经的成长之路。如今职业教育培训行业里流水式打造出来的coder,加上每年211/985高校毕业出来不少IT行业的佼佼者,行业内卷化越来越严重,不去提高自己,只会慢慢变得毫无竞争力。局限于CURD,当应用上线出现异常,不会排除,给不出解决方案,一次次表现机会拱手让人,升职加薪与自己毫无关系。本文一起来讨论一些数据库连接池上的一些优化措施,让应用跑得流畅,让自己解放。
数据库连接池提升了编码效率的同时,还提升了应用程序的性能。但使用不当可能会造成资源的浪费、线程阻塞、内存泄漏等问题,严重的可直接导致应用宕机。在应用的连接池配置上可有如下优化点。
1、超时配置
在网络情况良好的情况下,适当降低相应的超时配置,这样能够避免数据库异常时从而导致大量的工作现场阻塞。
比如druid连接池的maxWait参数,默认是-1,既不超时,可调整在2秒以下。hikari连接池的connectionTimeout参数,默认是30000毫秒,也可以调整到2秒以下,但最低不能低于250ms,该连接池还有一个不常用的参数validationTimeout,该validationTimeout参数必须要小于connectionTimeout,它的默认值是5000ms,可调整到1000ms以下,最低也只能为250ms。
2、连接池的大小
使用连接池时,若配置了超量的连接会导致资源的浪费,设置小了会导致连接池的优点发挥不了作用,合理设置大小格外重要。
最小空闲连接数建议设置为:CPU 核数 * 2 + 挂载的磁盘数量,如8C8G的主机可设置为 8 * 2 + 2 = 18.
最大实际连接数建议设置为:最大实际连接数 <= 最小空闲连接数 * 5,不超过最小空闲连接数的5倍。
比如druid的minIdle和maxIdle参数,maxIdle参数默认为8;hikari的minimumIdle和maximumPoolSize参数,这两个参数默认参数都为10。
3、连接池隔离
在线程池的使用过程中,如果线程中有IO密集型和任务密集型的线程混在一起的时候,会对这两种线程进行拆分,放到不同的线程池中执行。在数据库连接池中也建议做同样的隔离处理,比如应用中同时要处理接口请求的和定时任务,最好使用两个相互独立的连接池,避免定时任务长时间持有数据库连接,导致接口处理线程没法及时获取数据库连接。当然这种情况下最好将定时任务独立出来形成一个组件。
4、连接可用性检验
需要定期的检查连接池中的连接是否健康,从而避免应用获取到不可用的数据库连接导致应用异常。
比如druid连接池就自带这连接池的监控,可以很好的利用起来。像hikari连接次可以通过配置maxLifetime参数,通过定时替换连接池的连接,保持连接的健康状态,默认参数是30分钟,建议设置为比数据库层面连接时间短几秒,不建议设置为0,因为0表示寿命无限大;连接池也是内存泄漏容易出现的地方,hikari连接池可以通过设置leakDetectionThreshold来定时检测是否有线程长时间占有连接没有释放导致内存泄漏,该功能默认是关闭的,建议配置开启,设置为5秒到2秒,最低只能到2秒。