HikariCP為這么快?
- 字節碼級別優化(很多⽅方法通過 JavaAssist ⽣生成)
- 大量細節優化
- 用 FastStatementList 代替 ArrayList
- 無鎖集合 ConcurrentBag
- 代理類的優化(⽐如,用 invokestatic 代替了 invokevirtual,減少字節碼指令行數)
配置
## 數據源配置
spring.datasource.hikari.maximumPoolSize=5
spring.datasource.hikari.minimumIdle=5
# 連接最大空閑時間,超出后連接銷毀
spring.datasource.hikari.idleTimeout=600000
# 連接超時時間
spring.datasource.hikari.connectionTimeout=30000
# 池中連接的最長使用時間,超出這個時間連接歸還后就會銷毀
spring.datasource.hikari.maxLifetime=1800000
springboot2.x默認連接池從Tomcat換成了Hikari。
使用DataSourceAutoConfiguration加載數據源配置,其中使用@Import注入數據源配置DataSourceConfiguration。
@Configuration(proxyBeanMethods = false)
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
protected static class PooledDataSourceConfiguration {
}
abstract class DataSourceConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
matchIfMissing = true)
static class Hikari {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
HikariDataSource dataSource(DataSourceProperties properties) {
HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}
}}
Alibaba Druid
Druid連接池是阿里巴巴開源的數據庫連接池項目。 Druid連接池為監控而生,內置強大的監控功能,監控特性不影響性能。功能強大,能防SQL注入,內置Logging能診斷Hack應用行為。
實用功能:
- 強大的監控
- ExceptionSorter,針對主流數據庫的返回碼都有支持
- SQL防注入
- 數據源加密配置
- 提供很多擴展點,方便擴展。
springboot2.x使用druid盡量剔除掉默認hikaricp連接池。
其他連接池問題
數據庫連接池的選擇
- 首先考慮可靠性和性能
- 功能。類似監控
- 可運維性。例如密碼加密
- 可擴展性。例如添加TraceId,打印sql,通過數據庫連接池更加通用。
- 其他:社區活躍度。
數據庫連接池的最大連接數在實際項目中怎么定
數據庫連接池連接數設置
Oracle Real-World Performance 小組做過這樣的實驗:在沒有任何其他更改的情況下,僅減少連接池大小就將應用程序的響應時間從約 100 毫秒減少到約 2 毫秒——提高了 50 倍以上。
計算的基本定律是,給定單個 CPU 資源,順序執行A和B總是比通過時間切片“同時”執行A和B快。一旦線程數超過 CPU 內核數,添加更多線程就會變慢,而不是變快。
數據庫的主要瓶頸可以概括為三個基本類別:CPU、磁盤、網絡。內存,與磁盤和網絡相比,帶寬有幾個數量級的差異。例如,磁盤存在尋道成本和旋轉成本,在此期間(“I/O 等待”),連接/查詢/線程只是“阻塞”等待磁盤。網絡同樣容易出現阻塞。
經驗公式
連接數 = ((core_count * 2) + Effective_spindle_count)
一個硬盤的小型 4 核 i7 服務器應該運行以下連接池: 9 = ((4 * 2) + 1).
業務場景
- 對於並發訪問,可以采用小的數據庫連接池,然后將剩下的業務線程放在隊列中等待。
- 如果系統中混合了長事務和短事務,正確的做法應該是創建兩個連接池,一個服務於長事務,一個服務於"實時"查詢,也就是短事務。
連接池配置原文