您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么配置使用HikariCP數據源”,在日常操作中,相信很多人在怎么配置使用HikariCP數據源問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么配置使用HikariCP數據源”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
HikariCP 這個數據源號稱是最快的數據源。 其實個人認為 性能肯定還是在SQL語句和數據庫。而且 這個數據源功能其實并不多。
個人不喜歡使用 將其作為主數據源。
druid 數據源對比
但是 如果將 HikariCP 作為讀取 讀取第三方 數據庫 也就是多數據源來 使用,個人認為是非常適合的。
package com.door.remote.dataSource; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.TimedCache; import cn.hutool.db.Db; import com.door.common.constants.DbConst; import com.door.common.constants.biz.dr.DbSetType; import com.door.entity.dr.AcDrDbSource; import com.door.utils.db.CfsDatabase; import com.zaxxer.hikari.HikariDataSource; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.sql.DataSource; import java.sql.SQLException; /** * 數據源管理器 * * @author oumin * @date 2021/1/23 10:01 */ @Component @Log4j2 public class DataSourceManager { // 24 小時超時 private static final long timeOut = 24 * 60 * 60 * 1000L; private final Object createLock = new Object(); private static final TimedCache<String, DataSource> timedDataSourceCache = CacheUtil.newTimedCache(timeOut); @PostConstruct // 初始化方法的注解方式 等同與init-method=init public void init() { // 啟動定時任務,每 xx 毫秒 檢查一次過期 timedDataSourceCache.schedulePrune(timeOut); } /** * 獲取數據源 * * @return */ public DataSource getAndMaybePut(CfsDatabase cfsDatabase) { String key = cfsDatabase.toString(); DataSource curr = timedDataSourceCache.get(key); if (curr == null) { synchronized (this.createLock) { curr = timedDataSourceCache.get(key); if (curr == null) { timedDataSourceCache.put(key, this.createDataSource(cfsDatabase)); } return timedDataSourceCache.get(key); } } else { return curr; } } private DataSource createDataSource(CfsDatabase cfsDatabase) { HikariDataSource dataSource = new HikariDataSource(); dataSource.setDriverClassName(DbConst.getDbDriverByDbType(cfsDatabase.getDbType())); if (DbSetType.DB_MYSQL.getName().equalsIgnoreCase(cfsDatabase.getDbType())) { // 兼容 MYSQL8 時區,和 指定連接超時 connectTimeout=20000 , 和 不使用 SSL: characterEncoding=utf- 8&useSSL=false&serverTimezone=Hongkong String timeZone = cfsDatabase.getTimeZone(); String url = cfsDatabase.getUrl(); String urlDb = ""; if (StringUtils.isNoneBlank(timeZone)) { urlDb = DbConst.MYSQL_URL + url + DbConst.MYSQL_STR + timeZone + DbConst.MYSQL_TIME_OUT; } else { // 如果timeZone 為空,mysql就用默認的時區 urlDb = DbConst.MYSQL_URL + url + DbConst.MYSQL_STR_ZOOR + DbConst.MYSQL_TIME_OUT; } dataSource.setJdbcUrl(urlDb); } else { dataSource.setJdbcUrl(cfsDatabase.getUrl()); } dataSource.setUsername(cfsDatabase.getUserName()); dataSource.setPassword(cfsDatabase.getPassword()); // dataSource.setPassword(PasswordKey.getDecodePassword(source.getDatasourcePassword())); dataSource.setMaximumPoolSize(10); dataSource.setMinimumIdle(1); // 默認 30S // dataSource.setConnectionTimeout(source.getConnTimeout()); // 修復 連接超時異常 // 默認false . 目前業務都是查詢而已 // dataSource.setReadOnly(true); 只讀模式,如果數據庫支持 只讀模式才有優化效果,否則沒有 // 單位都是毫秒以下的 dataSource.setIdleTimeout(60 * 1000L); dataSource.setValidationTimeout(3 * 1000L); dataSource.setMaxLifetime(300 * 1000L); // mysql 和 Oracle 使用 SELECT 1 FROM DUAL ,其他 數據庫 使用 select 1 // 雖然 官網 不推薦配置這個 TestQuery 而是在數據庫支持JDBC4規范的情況下就不要配置。但是避免麻煩還是配置加上了 dataSource.setConnectionTestQuery(DbConst.getTestSQL(cfsDatabase.getDbType())); dataSource.setPoolName("數據源ID" + cfsDatabase.getSourceId()); return dataSource; } /** * 測試SQL * * @param sql 測試SQL * @param dbSource 測試數據源 */ public void testSQL(String sql, AcDrDbSource dbSource) throws SQLException { log.info("測試SQL :{}", sql); CfsDatabase database = CfsDatabase.converterByDataSource(dbSource); DataSource dataSource = this.getAndMaybePut(database); Db.use(dataSource).query(sql); } }
到此,關于“怎么配置使用HikariCP數據源”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。