HikariCP 数据源配置使用

使用场景

HikariCP 这个数据源号称是最快的数据源。 其实个人认为 性能肯定还是在SQL语句和数据库。而且 这个数据源功能其实并不多。
个人不喜欢使用 将其作为主数据源。
druid 数据源对比

但是 如果将 HikariCP 作为读取 读取第三方 数据库 也就是多数据源来 使用,个人认为是非常适合的。

多数据源配置

1package com.door.remote.dataSource; 2 3import cn.hutool.cache.CacheUtil; 4import cn.hutool.cache.impl.TimedCache; 5import cn.hutool.db.Db; 6import com.door.common.constants.DbConst; 7import com.door.common.constants.biz.dr.DbSetType; 8import com.door.entity.dr.AcDrDbSource; 9import com.door.utils.db.CfsDatabase; 10import com.zaxxer.hikari.HikariDataSource; 11import lombok.extern.log4j.Log4j2; 12import org.apache.commons.lang3.StringUtils; 13import org.springframework.stereotype.Component; 14 15import javax.annotation.PostConstruct; 16import javax.sql.DataSource; 17import java.sql.SQLException; 18 19/** 20 * 数据源管理器 21 * 22 * @author oumin 23 * @date 2021/1/23 10:01 24 */ 25@Component 26@Log4j2 27public class DataSourceManager { 28 29 // 24 小时超时 30 private static final long timeOut = 24 * 60 * 60 * 1000L; 31 32 private final Object createLock = new Object(); 33 34 private static final TimedCache<String, DataSource> timedDataSourceCache = 35 CacheUtil.newTimedCache(timeOut); 36 37 @PostConstruct // 初始化方法的注解方式 等同与init-method=init 38 public void init() { 39 40 // 启动定时任务,每 xx 毫秒 检查一次过期 41 timedDataSourceCache.schedulePrune(timeOut); 42 } 43 44 /** 45 * 获取数据源 46 * 47 * @return 48 */ 49 public DataSource getAndMaybePut(CfsDatabase cfsDatabase) { 50 String key = cfsDatabase.toString(); 51 DataSource curr = timedDataSourceCache.get(key); 52 if (curr == null) { 53 synchronized (this.createLock) { 54 curr = timedDataSourceCache.get(key); 55 if (curr == null) { 56 timedDataSourceCache.put(key, this.createDataSource(cfsDatabase)); 57 } 58 return timedDataSourceCache.get(key); 59 } 60 } else { 61 return curr; 62 } 63 } 64 65 private DataSource createDataSource(CfsDatabase cfsDatabase) { 66 HikariDataSource dataSource = new HikariDataSource(); 67 dataSource.setDriverClassName(DbConst.getDbDriverByDbType(cfsDatabase.getDbType())); 68 69 if (DbSetType.DB_MYSQL.getName().equalsIgnoreCase(cfsDatabase.getDbType())) { 70 // 兼容 MYSQL8 时区,和 指定连接超时 connectTimeout=20000 , 和 不使用 SSL: characterEncoding=utf- 8&useSSL=false&serverTimezone=Hongkong 71 String timeZone = cfsDatabase.getTimeZone(); 72 String url = cfsDatabase.getUrl(); 73 String urlDb = ""; 74 if (StringUtils.isNoneBlank(timeZone)) { 75 urlDb = DbConst.MYSQL_URL + url + DbConst.MYSQL_STR + timeZone + DbConst.MYSQL_TIME_OUT; 76 } else { 77 // 如果timeZone 为空,mysql就用默认的时区 78 urlDb = DbConst.MYSQL_URL + url + DbConst.MYSQL_STR_ZOOR + DbConst.MYSQL_TIME_OUT; 79 } 80 dataSource.setJdbcUrl(urlDb); 81 } else { 82 dataSource.setJdbcUrl(cfsDatabase.getUrl()); 83 } 84 85 dataSource.setUsername(cfsDatabase.getUserName()); 86 dataSource.setPassword(cfsDatabase.getPassword()); 87 // dataSource.setPassword(PasswordKey.getDecodePassword(source.getDatasourcePassword())); 88 dataSource.setMaximumPoolSize(10); 89 dataSource.setMinimumIdle(1); 90 91 // 默认 30S 92 // dataSource.setConnectionTimeout(source.getConnTimeout()); 93 94 // 修复 连接超时异常 95 // 默认false . 目前业务都是查询而已 96 // dataSource.setReadOnly(true); 只读模式,如果数据库支持 只读模式才有优化效果,否则没有 97 98 // 单位都是毫秒以下的 99 dataSource.setIdleTimeout(60 * 1000L); 100 dataSource.setValidationTimeout(3 * 1000L); 101 dataSource.setMaxLifetime(300 * 1000L); 102 103 // mysql 和 Oracle 使用 SELECT 1 FROM DUAL ,其他 数据库 使用 select 1 104 // 虽然 官网 不推荐配置这个 TestQuery 而是在数据库支持JDBC4规范的情况下就不要配置。但是避免麻烦还是配置加上了 105 dataSource.setConnectionTestQuery(DbConst.getTestSQL(cfsDatabase.getDbType())); 106 dataSource.setPoolName("数据源ID" + cfsDatabase.getSourceId()); 107 return dataSource; 108 } 109 110 /** 111 * 测试SQL 112 * 113 * @param sql 测试SQL 114 * @param dbSource 测试数据源 115 */ 116 public void testSQL(String sql, AcDrDbSource dbSource) throws SQLException { 117 118 log.info("测试SQL :{}", sql); 119 CfsDatabase database = CfsDatabase.converterByDataSource(dbSource); 120 121 DataSource dataSource = this.getAndMaybePut(database); 122 123 Db.use(dataSource).query(sql); 124 } 125} 126 127

以上就是了,其实 特别是 多数据源是 读取远程第三方数据库的话,默认简单配置即可。

配置 HikariCP 支持 hive 和clickhousse

HikariCP 官方文档写在不支持 hive, clickhouse 等其他数据库,但是如果 将其使用 来查询 或者其他常规操作的话,是没有问题的。
毕竟底层都是 使用 JDBC 去 执行 SQL 。 clickhouse 参考
https://www.cnblogs.com/cicada-smile/p/11632251.html
hive参考

参考 资料

https://blog.csdn.net/ssxueyi/article/details/83505322
官方文档
https://www.sohu.com/a/139421422_505779

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Spring环境下JNDI的使用

上一篇记录的使JNDI的简单使用,今天记录的是SpringJNDI的配置。一、配置JNDI的数据源数据源有两种配置方式:1、将数据源配置在tomcat等web容器中(以tomcat为例),这样做的好处就是运行在配置过JNDI数据源的web容器下的项目都可以使用该数据源,也就是说在容器中配置好数据源之后,数据源在该web容器中是共享的。配

Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理

在一个SpringBoot项目中,连接多个数据源还是比较常见的。之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见:SpringBoot2.x基础教程:JdbcTemplate的多数据源配置(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.didisp

0018SpringBoot连接docker中的mysql并使用druid数据源

由于druid数据源自带监控功能,所以引用druid数据源1、centos7中安装并启动docker2、docker安装并启动mysql3、pom.xml中引入druid依赖4、application.yml中配置数据库连接及druid数据源信息5、编写DruidConfig配置文件,绑定4中所配置的数据源信息6、编写HelloCon

HikariCP 数据源配置使用 - HelloWorld