介紹
快速凑队,簡(jiǎn)單,可靠蓄坏。HikariCP是一個(gè)“零開(kāi)銷”生產(chǎn)就緒JDBC連接池企巢。大約130Kb枫慷,lib非常輕
mave引用
- Java 8到11 maven配置:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.3.1</version>
</dependency>
- Java 7 maven配置(維護(hù)模式):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java7</artifactId>
<version>2.4.13</version>
</dependency>
- Java 6 maven配置(維護(hù)模式):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
<version>2.3.13</version>
</dependency>
初始化例子
val hikariConfig = new HikariConfig()
hikariConfig.setDriverClassName("com.mysql.jdbc.Driver")
hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false")
hikariConfig.setUsername("root")
hikariConfig.setPassword("password")
hikariConfig.setConnectionTimeout(30000)
hikariConfig.setMaxLifetime(30 * 1000 * 60)
hikariConfig.addDataSourceProperty("cachePrepStmts", "true")
hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250")
hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048")
try {
new HikariDataSource(hikariConfig)
}
catch {
case ex: Exception =>
logger.error("[DB connection error]", ex)
throw ex
}
或直接實(shí)例化HikariDataSource如此:
HikariDataSource ds = new HikariDataSource()
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test")
ds.setUsername("root")
ds.setPassword("password")
...
或基于屬性文件:
HikariConfig config = new HikariConfig("/hikari.properties")
HikariDataSource ds = new HikariDataSource(config)
示例屬性文件:
dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
dataSource.user=test
dataSource.password=test
dataSource.databaseName=mydb
dataSource.portNumber=5432
dataSource.serverName=localhost
或基于java.util.Properties:
Properties props = new Properties()
props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource")
props.setProperty("dataSource.user", "test")
props.setProperty("dataSource.password", "test")
props.setProperty("dataSource.databaseName", "mydb")
HikariConfig config = new HikariConfig(props)
HikariDataSource ds = new HikariDataSource(config)
必需的
??dataSourceClassName
這是DataSourceJDBC驅(qū)動(dòng)程序提供的類的名稱。請(qǐng)參閱特定JDBC驅(qū)動(dòng)程序的文檔以獲取此類名,或參見(jiàn)下表流礁。注意不支持XA數(shù)據(jù)源。XA需要像bitronix這樣的真實(shí)事務(wù)管理器 罗丰。請(qǐng)注意神帅,如果您使用的jdbcUrl是“old-school”基于DriverManager的JDBC驅(qū)動(dòng)程序配置,則不需要此屬性 萌抵。 默認(rèn)值:無(wú)
- 要么 -
??jdbcUrl
此屬性指示HikariCP使用“基于DriverManager的”配置找御。我們認(rèn)為基于DataSource的配置(上面)由于各種原因(見(jiàn)下文)而優(yōu)越,但對(duì)于許多部署而言绍填,幾乎沒(méi)有顯著差異霎桅。 將此屬性與“舊”驅(qū)動(dòng)程序一起使用時(shí),您可能還需要設(shè)置該driverClassName屬性讨永,但首先嘗試不使用該屬性 滔驶。 請(qǐng)注意,如果使用此屬性卿闹,您仍可以使用DataSource屬性來(lái)配置驅(qū)動(dòng)程序揭糕,實(shí)際上建議使用URL本身中指定的驅(qū)動(dòng)程序參數(shù)。 默認(rèn)值:無(wú)
??username
此屬性設(shè)置從基礎(chǔ)驅(qū)動(dòng)程序獲取Connections時(shí)使用的默認(rèn)身份驗(yàn)證用戶名锻霎。請(qǐng)注意著角,對(duì)于DataSources,它通過(guò)調(diào)用DataSource.getConnection(username, password)底層DataSource 以非常確定的方式工作旋恼。但是吏口,對(duì)于基于驅(qū)動(dòng)程序的配置,每個(gè)驅(qū)動(dòng)程序都不同冰更。在基于驅(qū)動(dòng)程序的情況下产徊,HikariCP將使用此屬性在傳遞給驅(qū)動(dòng)程序的調(diào)用中username設(shè)置user屬性。如果這不是您所需要的冬殃,請(qǐng)完全跳過(guò)此方法并調(diào)用囚痴,例如。 默認(rèn)值:無(wú)PropertiesDriverManager.getConnection(jdbcUrl, props)addDataSourceProperty("username", ...)
??password
此屬性設(shè)置從基礎(chǔ)驅(qū)動(dòng)程序獲取Connections時(shí)使用的默認(rèn)驗(yàn)證密碼审葬。請(qǐng)注意深滚,對(duì)于DataSources,它通過(guò)調(diào)用DataSource.getConnection(username, password)底層DataSource 以非常確定的方式工作涣觉。但是痴荐,對(duì)于基于驅(qū)動(dòng)程序的配置,每個(gè)驅(qū)動(dòng)程序都不同官册。在基于驅(qū)動(dòng)程序的情況下生兆,HikariCP將使用此屬性在傳遞給驅(qū)動(dòng)程序的調(diào)用中password設(shè)置password屬性。如果這不是您所需要的膝宁,請(qǐng)完全跳過(guò)此方法并調(diào)用鸦难,例如根吁。 默認(rèn)值:無(wú)PropertiesDriverManager.getConnection(jdbcUrl, props)addDataSourceProperty("pass", ...)
經(jīng)常使用
?autoCommit
此屬性控制從池返回的連接的默認(rèn)自動(dòng)提交行為。它是一個(gè)布爾值合蔽。 默認(rèn)值:true
? connectionTimeout
此屬性控制客戶端(即您)等待池中連接的最大毫秒數(shù)击敌。如果在沒(méi)有連接可用的情況下超過(guò)此時(shí)間,則將拋出SQLException拴事。最低可接受的連接超時(shí)為250毫秒沃斤。 默認(rèn)值:30000(30秒)
? idleTimeout
此屬性控制允許連接在池中空閑的最長(zhǎng)時(shí)間。 此設(shè)置僅在minimumIdle定義為小于時(shí)才適用maximumPoolSize刃宵。一旦池到達(dá)連接衡瓶, 空閑連接將不會(huì)退出minimumIdle。連接是否空閑退出的最大變化為+30秒牲证,平均變化為+15秒哮针。在此超時(shí)之前,連接永遠(yuǎn)不會(huì)被空閑从隆。值為0表示永遠(yuǎn)不會(huì)從池中刪除空閑連接诚撵。允許的最小值為10000毫秒(10秒)。 默認(rèn)值:600000(10分鐘)
? maxLifetime
此屬性控制池中連接的最長(zhǎng)生命周期键闺。使用中的連接永遠(yuǎn)不會(huì)退役寿烟,只有當(dāng)它關(guān)閉時(shí)才會(huì)被刪除。在逐個(gè)連接的基礎(chǔ)上辛燥,應(yīng)用輕微的負(fù)衰減以避免池中的大量滅絕筛武。 我們強(qiáng)烈建議設(shè)置此值,它應(yīng)比任何數(shù)據(jù)庫(kù)或基礎(chǔ)結(jié)構(gòu)強(qiáng)加的連接時(shí)間限制短幾秒挎塌。 值0表示沒(méi)有最大壽命(無(wú)限壽命)徘六,當(dāng)然主題是idleTimeout設(shè)置。 默認(rèn)值:1800000(30分鐘)
??connectionTestQuery
如果您的驅(qū)動(dòng)程序支持JDBC4榴都,我們強(qiáng)烈建議您不要設(shè)置此屬性待锈。這適用于不支持JDBC4的“遺留”驅(qū)動(dòng)程序Connection.isValid() API。這是在從池中給出連接之前執(zhí)行的查詢嘴高,以驗(yàn)證與數(shù)據(jù)庫(kù)的連接是否仍然存在竿音。再次嘗試運(yùn)行沒(méi)有此屬性的池,如果您的驅(qū)動(dòng)程序不符合JDBC4拴驮,HikariCP將記錄錯(cuò)誤以通知您春瞬。 默認(rèn)值:無(wú)
??minimumIdle
此屬性控制HikariCP嘗試在池中維護(hù)的最小空閑連接數(shù)。如果空閑連接低于此值并且池中的總連接數(shù)小于maximumPoolSize套啤,則HikariCP將盡最大努力快速有效地添加其他連接宽气。但是,為了獲得最高性能和對(duì)峰值需求的響應(yīng),我們建議不要設(shè)置此值萄涯,而是允許HikariCP充當(dāng)固定大小的連接池绪氛。 默認(rèn)值:與maximumPoolSize相同
??maximumPoolSize
此屬性控制允許池到達(dá)的最大大小,包括空閑和正在使用的連接涝影〕ィ基本上,此值將確定數(shù)據(jù)庫(kù)后端的最大實(shí)際連接數(shù)袄琳。對(duì)此的合理值最好由您的執(zhí)行環(huán)境決定。當(dāng)池達(dá)到此大小且沒(méi)有空閑連接可用時(shí)燃乍,對(duì)getConnection()的調(diào)用將connectionTimeout在超時(shí)前阻塞最多毫秒唆樊。請(qǐng)閱讀有關(guān)連接池尺寸的信息。 默認(rèn)值:10
??metricRegistry
此屬性僅可通過(guò)編程配置或IoC容器獲得刻蟹。此屬性允許您指定池使用的Codahale / Dropwizard 實(shí)例MetricRegistry來(lái)記錄各種度量標(biāo)準(zhǔn)逗旁。有關(guān) 詳細(xì)信息,請(qǐng)參閱度量維基頁(yè)面舆瘪。 默認(rèn)值:無(wú)
??healthCheckRegistry
此屬性僅可通過(guò)編程配置或IoC容器獲得片效。此屬性允許您指定池使用的Codahale / Dropwizard 實(shí)例HealthCheckRegistry來(lái)報(bào)告當(dāng)前的健康信息。有關(guān) 詳細(xì)信息英古,請(qǐng)參閱運(yùn)行狀況檢查維基頁(yè)面淀衣。 默認(rèn)值:無(wú)
??poolName
此屬性表示連接池的用戶定義名稱,主要顯示在日志記錄和JMX管理控制臺(tái)中召调,以標(biāo)識(shí)池和池配置膨桥。 默認(rèn)值:自動(dòng)生成
不經(jīng)常使用
? initializationFailTimeout
如果無(wú)法成功為初始連接添加池,則此屬性控制池是否“快速失敗”唠叛。任何正數(shù)都被認(rèn)為是嘗試獲取初始連接的毫秒數(shù); 在此期間只嚣,應(yīng)用程序線程將被阻止。如果在此超時(shí)發(fā)生之前無(wú)法獲取連接艺沼,則將引發(fā)異常册舞。此超時(shí)被應(yīng)用后的connectionTimeout 期。如果值為零(0)障般,HikariCP將嘗試獲取并驗(yàn)證連接调鲸。如果獲得連接但驗(yàn)證失敗,則將引發(fā)異常并且池未啟動(dòng)剩拢。但是线得,如果無(wú)法獲得連接,則池將啟動(dòng)徐伐,但稍后獲取連接的努力可能會(huì)失敗贯钩。小于零的值將繞過(guò)任何初始連接嘗試,并且池將在嘗試在后臺(tái)獲取連接時(shí)立即啟動(dòng)。因此角雷,稍后獲得連接的努力可能失敗祸穷。 默認(rèn)值:1
?isolateInternalQueries
此屬性確定HikariCP是否在其自己的事務(wù)中隔離內(nèi)部池查詢,例如連接活動(dòng)測(cè)試勺三。由于這些通常是只讀查詢雷滚,因此很少需要將它們封裝在自己的事務(wù)中。此屬性僅在autoCommit禁用時(shí)適用吗坚。 默認(rèn)值:false
?allowPoolSuspension
此屬性控制是否可以通過(guò)JMX掛起和恢復(fù)池祈远。這對(duì)某些故障轉(zhuǎn)移自動(dòng)化方案很有用。當(dāng)池暫停時(shí)商源,調(diào)用 getConnection()將不會(huì)超時(shí)并將一直保持到池恢復(fù)為止车份。 默認(rèn)值:false
?readOnly
此屬性控制默認(rèn)情況下從池中獲取的Connections是否處于只讀模式。請(qǐng)注意牡彻,某些數(shù)據(jù)庫(kù)不支持只讀模式的概念扫沼,而其他數(shù)據(jù)庫(kù)在Connection設(shè)置為只讀時(shí)提供查詢優(yōu)化。您是否需要此屬性在很大程度上取決于您的應(yīng)用程序和數(shù)據(jù)庫(kù)庄吼。 默認(rèn)值:false
?registerMbeans
此屬性控制是否注冊(cè)JMX管理Bean(“MBean”)缎除。 默認(rèn)值:false
??catalog
該屬性設(shè)置默認(rèn)目錄為支持目錄的概念數(shù)據(jù)庫(kù)。如果未指定此屬性总寻,則使用JDBC驅(qū)動(dòng)程序定義的缺省目錄器罐。 默認(rèn)值:驅(qū)動(dòng)程序默認(rèn)
??connectionInitSql
此屬性設(shè)置一個(gè)SQL語(yǔ)句,該語(yǔ)句將在每次創(chuàng)建新連接之后執(zhí)行渐行,然后再將其添加到池中技矮。如果此SQL無(wú)效或引發(fā)異常,則將其視為連接失敗殊轴,并將遵循標(biāo)準(zhǔn)重試邏輯衰倦。 默認(rèn)值:無(wú)
??driverClassName
HikariCP將嘗試僅通過(guò)驅(qū)動(dòng)程序管理器來(lái)解析驅(qū)動(dòng)程序jdbcUrl旁理,但對(duì)于某些較舊的驅(qū)動(dòng)程序樊零,driverClassName還必須指定。除非您收到明顯的錯(cuò)誤消息孽文,指出未找到驅(qū)動(dòng)程序驻襟,否則請(qǐng)忽略此屬性。 默認(rèn)值:無(wú)
??transactionIsolation
此屬性控制從池返回的連接的默認(rèn)事務(wù)隔離級(jí)別芋哭。如果未指定此屬性沉衣,則使用JDBC驅(qū)動(dòng)程序定義的缺省事務(wù)隔離級(jí)別。如果您具有所有查詢通用的特定隔離要求减牺,則僅使用此屬性豌习。此屬性的值是從不斷的名稱Connection 類存谎,如TRANSACTION_READ_COMMITTED,TRANSACTION_REPEATABLE_READ等 默認(rèn)值:驅(qū)動(dòng)程序默認(rèn)
? validationTimeout
此屬性控制連接測(cè)試活動(dòng)的最長(zhǎng)時(shí)間肥隆。該值必須小于connectionTimeout既荚。最低可接受的驗(yàn)證超時(shí)為250毫秒。 默認(rèn)值:5000
? leakDetectionThreshold
此屬性控制在記錄消息之前連接可以離開(kāi)池的時(shí)間量栋艳,指示可能的連接泄漏恰聘。值為0表示禁用泄漏檢測(cè)。啟用泄漏檢測(cè)的最低可接受值是2000(2秒)吸占。 默認(rèn)值:0
? dataSource
此屬性僅可通過(guò)編程配置或IoC容器獲得晴叨。此屬性允許您直接設(shè)置DataSource要由池包裝的實(shí)例,而不是讓HikariCP通過(guò)反射構(gòu)造它矾屯。這在一些依賴注入框架中很有用篙螟。指定此屬性后,dataSourceClassName將忽略該屬性和所有特定于DataSource的屬性问拘。 默認(rèn)值:無(wú)
??schema
該屬性設(shè)置的默認(rèn)模式為支持模式的概念數(shù)據(jù)庫(kù)。如果未指定此屬性惧所,則使用JDBC驅(qū)動(dòng)程序定義的默認(rèn)架構(gòu)骤坐。 默認(rèn)值:驅(qū)動(dòng)程序默認(rèn)
? threadFactory
此屬性僅可通過(guò)編程配置或IoC容器獲得。此屬性允許您設(shè)置java.util.concurrent.ThreadFactory將用于創(chuàng)建池使用的所有線程的實(shí)例下愈。在某些受限執(zhí)行環(huán)境中需要它纽绍,其中線程只能通過(guò)ThreadFactory應(yīng)用程序容器提供的方式創(chuàng)建。 默認(rèn)值:無(wú)
? scheduledExecutor
此屬性僅可通過(guò)編程配置或IoC容器獲得势似。此屬性允許您設(shè)置java.util.concurrent.ScheduledExecutorService將用于各種內(nèi)部計(jì)劃任務(wù)的實(shí)例拌夏。如果向HikariCP提供ScheduledThreadPoolExecutor 實(shí)例,建議setRemoveOnCancelPolicy(true)使用履因。 默認(rèn)值:無(wú)
遺漏的配置
正如你在上面看到的那樣障簿,HikariCP有很多“配置”,但比其他一些連接池要少栅迄。這是一種設(shè)計(jì)理念站故。HikariCP設(shè)計(jì)美學(xué)是極簡(jiǎn)主義。為了保持 簡(jiǎn)單毅舆,更好或更少是更多的設(shè)計(jì)理念西篓,有些配置是故意遺漏的。
語(yǔ)句緩存
許多連接池憋活,包括Apache DBCP岂津,Vibur,c3p0和其他連接池都提供PreparedStatement緩存悦即。HikariCP沒(méi)有吮成。為什么橱乱?
在連接池層,每個(gè)連接PreparedStatements只能緩存赁豆。如果您的應(yīng)用程序有250個(gè)常用查詢和20個(gè)連接池仅醇,那么您要求數(shù)據(jù)庫(kù)保留5000個(gè)查詢執(zhí)行計(jì)劃 - 同樣,池必須緩存這么多及其相關(guān)的對(duì)象圖魔种。PreparedStatements
大多數(shù)主要的數(shù)據(jù)庫(kù)JDBC驅(qū)動(dòng)程序已經(jīng)具有可以配置的Statement緩存析二,包括PostgreSQL,Oracle节预,Derby叶摄,MySQL,DB2等等安拟。JDBC驅(qū)動(dòng)程序處于利用數(shù)據(jù)庫(kù)特定功能的獨(dú)特位置蛤吓,幾乎所有緩存實(shí)現(xiàn)都能夠跨連接共享執(zhí)行計(jì)劃。這意味著糠赦,而不是內(nèi)存中的5000個(gè)語(yǔ)句和相關(guān)的執(zhí)行計(jì)劃会傲,250個(gè)常用的查詢會(huì)在數(shù)據(jù)庫(kù)中生成250個(gè)執(zhí)行計(jì)劃。聰明的實(shí)現(xiàn)甚至不會(huì)PreparedStatement在驅(qū)動(dòng)程序級(jí)別的內(nèi)存中保留 對(duì)象拙泽,而只是將新實(shí)例附加到現(xiàn)有的計(jì)劃ID淌山。
在池化層使用語(yǔ)句緩存是一種反模式,與驅(qū)動(dòng)程序提供的緩存相比顾瞻,會(huì)對(duì)應(yīng)用程序性能產(chǎn)生負(fù)面影響泼疑。