hikari数据源配置类_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 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 支持 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值