react 前端框架如何驱动企业数字化转型与创新发展
1044
2022-11-24
软件设计思想:池化技术
软件设计思想:池化技术
先举个例子
一种简单的架构:前端一台 Web 服务器运行业务代码,后端一台数据库服务器存储业务数据。
系统上线时,用户量不大,运行平稳,但是随着流量的提升,系统访问速度会变慢。
分析日志后,发现系统慢的原因是出现在系统库的交互上,因为数据调用的方式是首先获取数据库的连接,然后依靠这个连接,查询数据库的数据,最后释放数据库资源。
为什么频繁创建连接响应会变慢?
整个 MySQL 创建连接过程主要分成两个部分:
第一部分是采用建立 TCP 连接。通过三次握手 建立 TCP 连接。
客户端向服务端发送一个 SYN 包服务端给客户端发送一个 ACK 包和一个 SYN 包第三个是客户端给服务端发送一个 ACK 包
第二部分是 MySQL 服务端校验客户端密码的过程
第一个包是服务端给客户端要认证的报文,第二个和第三个包是客户端加密后发送给服务端的包,最后两个包是服务端给客户端 OK 的报文。
数据校验过程大概占整个查询过程的80% 时间,比如 数据校验占 4ms ,查询过程使用 1ms 这样频繁创建连接,创建连接严重影响了性能。
如何优化呢?
如果数据库不再频繁创建连接,如果实现就使用连接池,将连接先建立好,这样不频繁创建连接,那么查询性能会大大提升。
用连接池预先建立数据库连接
开发过程中往往会用到很多连接池,比如数据库连接池, HTTP 连接池,Redis 连接池等。
数据库连接池配置
如果当前连接数小于最小连接数,则创建新的数据库请求;如果连接池中有空闲连接则复用空闲连接如果空闲池中没有连接并且连接数小于最大连接数,则创建新的连接处理请求;如果当前连接数已经大于等于最大连接数,则按照配种中设定的时间(c3p0 checkoutTimeOut)等待旧连接可用。如果等待超过这个设定值则向用户抛出异常。
看个实例:
"select 1" 的命令用来检查连接是否可用。
testOnBorrow 配置项 是先校验连接是否可用,如果可用采用执行 SQL 语句。这种连接方式会引入多余的开销,线上可用尽量不要使用,在测试服务上可用。
initialSize,连接初始值,连接池启动时创建的连接数量的初始值maxActive,连接池的最大值,同一时间可以从池分配的最多连接数量,0时无限制maxIdle,最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 ,0时无限制minIdle,最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请poolPreparedStatements,是否对已备语句进行池管理(布尔值),是否对PreparedStatement进行缓存defaultAutoCommit,是否对sql进行自动提交,进行事务管理的时候往往要关闭jdbc的自动提交功能。
假设有一个接口,需要三次访问数据库,但是根据经验判断,觉得这个可能成为系统瓶颈,为避免频繁创建线程导致的开销,可以使用线程池来管理多个线程与数据库的交互。
用线程池创建线程
JDK 1.5 中引入的 ThreadPoolExecutor 就是一种线程池的实现,有几个重要的参数:coreThreadPool 和 maxThreadCount,这两个参数控制整个线程池的执行过程。
当线程池中的线程数小于 coreThreadCount 时,处理新的任务是会创建新的线程。如果线程数大于 coreThreadCount ,则把任务丢到一个队列中,当有空闲线程再执行。当队列中的任务队列满了的时候,则继续创建线程,直到达到 maxThreadCount。当线程数达到 maxThreadCount 时,还有新的任务提交,那么我们不得不将他们丢弃。
实际项目中曾经有这么个问题,任务丢给线程池后,长时间都没有被执行,后来排查发现是 coreThreadCount 和 maxThreadCount 设置的比较小。
池化技术
池化技术的思想: 核心思想是空间换时间,期望使用预先创建好的对象来减少频繁创建对象的性能开销,同时还可以对对象进行统一管理,减少对象使用成本。
总结
池子的最大值和最小值设置需要根据实际运行情况做调整池子中的对象在需要在使用前预先初始化,比如线程池先创建核心线程。池化技术的核心思想是空间换时间,避免出现空间过度使用出现内存泄露或者频繁垃圾回收等问题。
博客:王小明
关注我们,了解更多
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~