数据库连接池
概述
数据库连接的建立是一种耗时长,性能低,代价高的操作,频繁的进行数据库连接的建立和关闭会极大影响系统的性能。此外,数据库同时支持的连接总数也是有限的。数据库连接池的出现,正是为了减少应用程序和数据库之间的创建和销毁TCP连接的开销。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接,来避免因为没有释放数据库连接而引起的数据库连接遗漏。
数据库连接池的原理
在内存中开辟一片空间,将一定数量的数据库连接作为对象存储在对象池中,并对外提供数据库连接的获取和归还方法。除此之外,数据库连接池还提供并发,连接数控制,监控,外部配置,资源重用,检测及容灾,多库多服务,事务处理,定时任务,缓存,异常处理,组件维护等功能。
连接池的大小不是越大越好,而是应该小到恰到好处。
常见数据库连接池
1、c3p0:成熟的,高并发的JDBC连接池,支持缓存和重用PreparedStatements。
2、Proxool
3、Jakarta DBCP
4、DDConnectionBroker
5、DBPool
6、XAPool
7、Primrose
8、SmartPool
9、MiniConnectionPoolManager
10、BoneCP:
11、Druid:开源项目,为监控而生的数据库连接池。
HikariCP
HikariCP,名字来源于日语“光”。官网对它的定义是:Fast,simple,reliable,HikariCP is a "zero-overhead" production ready JDBC connection pool。At roughly 130kb,the library is very
light。
SpringBoot2.0,选用HikariCP作为默认的数据库连接池。
HikariCP配置
HikariCP对所有的时间配置都采用毫秒。
必需配置
1、DataSourceClassName和jdbcUrl
2、username以及password
非必需配置
1、autoCommit:默认true,控制从池返回的连接的默认自动提交行为。
2、connectionTimeout:控制客户端等待池中连接的最长毫秒数,默认值30s。如果没有连接可用的情况下,超过此时间,则抛出SQLException异常。
3、idleTimeout:控制连接允许被闲置在池中的最大时间。
4、maxLifetime:控制池中连接的最大生命周期。关闭后的连接才会被移除。0表示无限生存期,默认为1800000。可以将其设置为比数据库的超时时间短一点。
5、connectionTestQuery:不建议配置。
6、minimumIdle:控制HikariCP尝试在池中维护的最小空闲连接数。应该小于等于maximumPoolSize。
7、maximumPoolSize:控制数据库连接池连接数允许到达的最大值,默认10。
与监控有关的配置
1、metricRegistry:
2、healthCheckRegistry:
3、poolName:用户定义的连接池名称。
非常用配置
1、initializationFailTimeout:如果池无法成功初始化连接,控制池是否快速失败。
2、isolateInternalQueries:是否在自己的事务中隔离内部池查询。
3、allowPoolSuspension:控制池是否可以通过JMX挂起和恢复。
4、readOnly:控制默认情况下从池中获取的Connections是否处于只读状态。
5、registerMbeans:是否注册JMX以管理Bean。默认false。
6、catalog:为支持catalog的数据库是设置默认catalog。
7、connectionInitSql:设置一个SQL语句,每次创建新连接后执行。
8、driverClassName:
9、transactionIsolation:控制从池中返回的连接的默认事务隔离级别。
10、validationTimeout:控制连接测试活性的最长时间,默认值5000。
11、leakDetectionThreshold:默认0,禁用泄漏检测。
12、dataSource:默认为none,仅通过编程配置或者IoC容器才可获得。
13、schema:默认:driver default。
14、threadFactory:默认为none,仅通过编程配置或者IoC容器才可获得。
15、scheduledExecutor:默认为none,仅通过编程配置或者IoC容器才可获得。