开始正文:
java web 数据源有很多,大家先简单了解一下吧
1、DBCP
DBCP是Apache推出的数据库连接池(Database Connection Pool)。
操作步骤:
添加jar包:
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
添加属性资源文件
dbcpconfig.properties文件并修改配置。
2、C3P0
操作步骤:
添加jar包
c3p0-0.9.1.2.jar
编写配置文件
创建一个c3p0-config.xml文件
3、JavaWeb之Tomcat管理数据源
上面2中方式都需要导入jar包,在JavaWeb服务器Tomcat中其实内置了数据源。所以不需要导入jar包。
Tomcat内置数据源其实也是DBCP,是Tomcat的lib目录下的tomcat-dbcp.jar。
配置数据源的步骤:
拷贝数据库连接的jar mysql-connector-java-5.1.7-bin.jar到tomcat/lib目录下
配置数据源XML文件
4、BoneCP
bonecp 号称比c3p0 dbcp 性能快25倍,主要是因为 bonecp采用了1.5引入的并行包,抛弃了锁机制
这里提供的maven的依赖 ,另为例子用了单机数据库hsqldb ,所以还需要你导入这个包,不过你可以
用本机的任意一款驱动尝试链接,方式与原始的jdbc连接方式是相同的.
5、还是来说说spring boot2.0 的 Hikari
介绍
快速,简单,可靠的数据源,spring boot2.0 已经将 HikariCP 做为了默认的数据源链接池,在官网测试中秒杀一切其他数据源,比如 commons-dbcp,tomcat,c3po,druid。
基本设计
Hikari 链接池采用了很多优化来提高并发数,可参考这里
所有数据库链接池都遵守基本的设计规则,实现 javax.sql.DataSource 接口,里面最重要的方法就是 Connection getConnection () throws SQLException; 用于获取一个 Connection, 一个 Connection 就是一个数据库链接,就是一个 TCP 链接,建立 TCP 链接是需要进行 3 次握手的,这降低来链接的使用效率,也是各种数据库链接池存在的原因。
数据库链接池通过事先建立好 Connection 并缓存起来,这样应用需要做数据查询的时候,直接从缓存中拿到 Connection 就可以使用来。数据库链接池还能够检测异常的链接,释放闲置的链接。
HikariDataSource
Hikari 中提供的 DataSource 是 HikariDataSource ,HikariDataSource 实现了 HikariConfig,和数据库的各种参数超时时间配置就正 HikariaConfig 中。
其中提供两种初始化方式,一种是默认的构造函数,单 new 一个 HikariDataSource 时,数据源的链接不会建立,需要等到第一次调用 HikariDataSource 的 getConnection 方法。数据源建立后的相关信息保存在 HikariDataSource 中变量 HikariPool pool。
另一种建立方式是调用带有 HikariConfig 的构造函数,这种方式适合多个数据源的建立,共享同一份配置。 这种方式在调用构造函数的时候就建立了数据源的链接。
HikariDataSource 的所有数据源获取都委托给了 HikariPool,一个数据源会有一个 HikariPool,一个 HikariPool 中有一个 ConcurrentBag,一个 ConcurrentBag 中多个 PoolEntry,一个 PoolEntry 对应一个 Connection。
HikariPool
HikariPool 中的基本 field 介绍。
PoolEntryCreator POOL_ENTRY_CREATOR:用于创建 PoolEntry,也就是用于创建 Connection 了,创建 Connection 是委托给驱动程序的。
Collection addConnectionQueue :就是一个 LinkedBlockingQueue,不过不能修改其中的内容。当正在创建底层 Connection 的时候这个 Queue 会有值。用户后续判断当前线程池里面还是否需要创建新的链接。
ThreadPoolExecutor addConnectionExecutor:创建 Connection 链接的执行是有这个线程池调度的。使用新的链接池不会而不使用当前的工作线程,为了不影响工作线程的执行(比如会导致工作线程超时)。
ThreadPoolExecutor closeConnectionExecutor:关闭 Connection 的链接是有这个线程池调度的。
ConcurrentBag connectionBag:这个是最重要的,每次获取 Connection 都是从这里面获取,采用了 ThreadLocal 来减少竞争。
ProxyLeakTaskFactory leakTaskFactory;参考 ProxyLeakTask 用于检测 Connection 泄漏。
ScheduledFuture> houseKeeperTask:用于管理链接池里面的链接,比如链接不够用了要创建链接,链接最大生存时间到了要关闭链接。线程池中的 Connection 就是有它初始化的。
ConcurrentBag
ConcurrentBag 设计主要为了解决并发对资源的争用,其中主要有 CopyOnWriteArrayList sharedList 和 ThreadLocal> threadList,SynchronousQueue handoffQueue,当一个线程获取链接的时候首先从自己的 ThreadLocal 中的 threadList 获取,当获取失败的时候才从 sharedList 获取,当从 sharedList 获取还是失败的话,就等待在 handoffQueue,这是一个同步的 Queue,当其他线程释放链接的时候,自己就会被唤醒。
当然 springboot 2.0 默认连接池就是Hikari了,所以引用parents后不用专门加依赖