欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > 数据库 >内容正文

数据库

mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别

发布时间:2025/4/16 数据库 98 豆豆
生活随笔 收集整理的这篇文章主要介绍了 mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1. MySQL连接池

连接池通常实现在client端,是指应用(客户端)预先创建一定的连接,利用这些连接服务于客户端所有的DB请求。如果某一个时刻,空闲的连接数小于DB的请求数,则需要将请求排队,等待空闲连接处理。

通过连接池可以复用连接,避免连接的频繁创建和释放,从而减少请求的平均响应时间,并且在请求繁忙时,通过请求排队,可以缓冲应用对DB的冲击。

常见的MySQL连接池Tomcat、WildFly(JBoss)、 c3p0、 Druid等。

2. MySQL线程缓存

线程缓存实现在server端,client连接对应的线程会被缓存起来,缓存的线程数量由 thread_cache_size大小决定。当服务器不断有大量连接创建、关闭的场景下,使用线程缓存能够重用缓存起来的线程,避免了线程大量创建销毁带来的性能消耗,但是仍然无法解决高连接数带来的线程数过高的问题。

线程缓存命中率计算:(1-Threads_created/Connections)

注意:

当线程池功能开启后,线程缓存会自动失效,即变量thread_cache_size将被忽略,Threads_cached 状态变量始终为0。

3. MySQL线程池

线程池实现在server端,通过创建一定数量的线程服务DB请求,相对于one-conection-per-thread的一个线程服务一个连接的方式,线程池服务的最小单位是SQL语句,即一个线程可以对应多个活跃的连接。通过线程池,可以将server端的服务线程数控制在一定的范围,减少了系统资源的竞争和线程创建、销毁以及上下文切换带来的消耗,同时也避免出现高连接数导致的高并发问题。

线程池是MySQL 5.6 的开始提供的一个核心功能,MySQL 5.6 之前,处理连接的方式是 one-thread-per-connection, 对于每一个client 连接都会创建一个独立的线程,请求结束,销毁线程。高并发下,导致线程的频繁创建和释放,以及频繁的线程上下文切换,降低了资源利用率。通过线程池,一个线程可以处理多个client连接请求,减少线程频繁创建释放以及线程上下文切换带来的性能损耗。

通过参数thread_handling来控制是否使用线程池,thread_handling 取值:

no-threads

one-thread-per-connection(默认值)

loaded-dynamically(大于等于5.7.9版本)

pool-of-threads(Percona版本)

Percona 在MySQL社区版基础上为 thread_handling 参数增加了pool-of-threads,Percona 的线程池实现在server层,与官方版以plugin形式实现不同,Percona版线程池与官方企业版并不兼容。

总结

以上是生活随笔为你收集整理的mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。