线程池作用
MySQL和MariaDB都推出了线程池方案,目前MySQL的线程池实现为插件方式,并且只添加在企业版本中,社区版没有,Percona移植了MariaDB的线程池功能,并做了进一步的优化。
1、减少线程重复创建与销毁部分的开销,提高性能
线程池技术通过预先创建一定数量的线程,在监听到有新的请求时,线程池直接从现有的线程中分配一个线程来提供服务,服务结束后这个线程不会直接销毁,而是又去处理其他的请求。
避免了线程和内存对象频繁创建和销毁,减少了上下文切换,提高了资源利用率,从而在一定程度上提高了系统的性能和稳定性。
2、对系统起到保护作用
线程池技术限制了并发线程数,相当于限制了数据库的running线程数,无论系统目前有多少连接或者请求,超过最大设置的线程数的都需要排队,让系统保持高性能水平,从而防止DB出现雪崩,对底层DB起到保护作用。
连接池作用
连接池一般在客户端设置,常用插件方式,例如市面上常用的druid插件维护的就是业务应用层与数据库连接的连接池。
1、提高系统性能和可用性
数据库连接的开销是比较大的,频繁地打开和关闭数据库连接会浪费大量的时间和资源。
使用连接池可以避免这种情况发生,提高系统的性能和可用性。
2、减轻数据库的负担
数据库在处理并发请求时会面临很大的压力,使用连接池可以减轻这种压力,提高数据库的响应速度。
3、管理数据库连接数量
使用连接池可以有效地管理数据库连接的数量,避免连接过多或连接过少的情况出现。
二者区别
也许有的DBA会把数据库线程池和连接池混淆,但其实两者是有很大区别的:
连接池一般在客户端设置,而线程池是在DB服务器上配置。
连接池的资源主要是前台数据库连接对象,而线程池的资源主要是线程对象和CPU等计算机资源。
连接池以空闲连接数量为主导策略,即保证最小限度满足请求。
而线程池则以最大并发线程数量为主导策略,即最大化利用系统资源。
所以连接池可以起到避免连接频繁创建和销毁,但是无法控制MySQL活动线程数的目标,在高并发场景下,无法起到保护DB的作用。
因此比较好的方式是将连接池和线程池结合起来使用。