线程池与数据库连接池的区别

一、线程池

原理:

类似于操作系统中的缓冲区,流程如下:先启动若干数量的线程,并让线程处于休眠的状态,当客户端有新请求时就回唤醒其中一个睡眠线程进行请求处理,处理完又处于睡眠状态。

JAVA的六大线程池(Executors)

  • FixedThreadPool(定长连接池):

    • 固定线程池中线程的个数。使用静态方法 newFixedThreadPool() 创建线程池的时候指定线程池个数。
    • 适用:执行长期的任务。
  • CachedThreadPool(弹性缓存线程池)

    • 使用 newCachedThreadPool() 方法创建该线程池对象,创建之初池中没有线程,当 execute 方法或 submit 方法向线程池提交任务时,会自动创建线程;如果有空余线程则不被创建,线程60秒后被回收。
    • 适用:执行很多短期异步的小程序或者负载较轻的服务器。
  • SingleThreadPool(单线程线程池)

    • 池中只有一个线程,如果有多个线程,则需要进行排队,可以保证任务的顺序执行。
    • 适用:顺序执行的任务场景。
  • ScheduledThreadpool(定时器线程池,定长线程池)

    • 支持定时及周期性任务执行。
    • 适应:周期性执行任务的场景。
  • WorkStealingPool

  • ForkJoinPool

 

二、连接池

原理

  • 数据库连接是一种关键的有限的昂贵资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。
  • 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

主流的数据库连接池

  • C3p0:开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程,性能较差,适用于小型系统,代码600KB左右。

  • DBCP (Database Connection Pool):Apache开发的一个Java数据库连接池项目, Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。

  • Tomcat Jdbc Pool:Tomcat在7.0以前都是使用common-dbcp做为连接池组件,但是dbcp是单线程,为保证线程安全会锁整个连接池,性能较差,dbcp有超过60个类,也相对复杂。Tomcat从7.0开始引入了新增连接池模块叫做Tomcat jdbc pool,基于Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通过异步方式获取连接,支持高并发应用环境,超级简单核心文件只有8个,支持JMX,支持XA Connection

  • BoneCP:官方说法BoneCP是一个高效、免费、开源的Java数据库连接池实现库。设计初衷就是为了提高数据库连接池性能,根据某些测试数据显示,BoneCP的速度是最快的,要比当时第二快速的连接池快25倍左右,完美集成到一些持久化产品如HibernateDataNucleus中。BoneCP特色:高度可扩展,快速;连接状态切换的回调机制;允许直接访问连接;自动化重置能力;JMX支持;懒加载能力;支持XML和属性文件配置方式;较好的Java代码组织,100%单元测试分支代码覆盖率;代码40KB左右。

  • Druid:Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上。

  • HikariCP:HikariCP通过优化(concurrentBag,fastStatementList )集合来提高并发的读写效率,使用threadlocal缓存连接及大量使用CAS的机制,最大限度的避免lock,但可能带来cpu使用率的上升。从字节码的维度优化代码,让方法尽量在35个字节码一下,来提升jvm的处理效率。

java-datasource-pool-compare-1

image

 

参考