HikariCP 数据源配置使用

Stella981
• 阅读 752

使用场景

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 支持 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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
浩浩 浩浩
3年前
【Flutter实战】图片和Icon
3.5图片及ICON3.5.1图片Flutter中,我们可以通过Image组件来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。ImageProviderImageProvider是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvi
Easter79 Easter79
3年前
Spring环境下JNDI的使用
上一篇记录的使JNDI的简单使用,今天记录的是SpringJNDI的配置。一、配置JNDI的数据源数据源有两种配置方式:1、将数据源配置在tomcat等web容器中(以tomcat为例),这样做的好处就是运行在配置过JNDI数据源的web容器下的项目都可以使用该数据源,也就是说在容器中配置好数据源之后,数据源在该web容器中是共享的。配
Stella981 Stella981
3年前
Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理
在一个SpringBoot项目中,连接多个数据源还是比较常见的。之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见:SpringBoot2.x基础教程:JdbcTemplate的多数据源配置(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.didisp
可莉 可莉
3年前
0018SpringBoot连接docker中的mysql并使用druid数据源
由于druid数据源自带监控功能,所以引用druid数据源1、centos7中安装并启动docker2、docker安装并启动mysql3、pom.xml中引入druid依赖4、application.yml中配置数据库连接及druid数据源信息5、编写DruidConfig配置文件,绑定4中所配置的数据源信息6、编写HelloCon
Stella981 Stella981
3年前
Spring Boot 集成MyBatis
SpringBoot集成MyBatis在集成MyBatis前,我们先配置一个druid数据源。SpringBoot系列1.SpringBoot入门(https://www.oschina.net/action/GoToLink?urlh
Stella981 Stella981
3年前
Spring4.0 + druid 配置动态配置数据源以及多数据源切换功能实现
数据源连接池使用druid其他的数据源基本原理相同spring中配置默认数据源连接池如下:<!数据源配置,使用BoneCP数据库连接池   <beanid"dataSourceOne"class"com.alibaba.druid.pool.DruidDataSource"initmethod"
Easter79 Easter79
3年前
Springboot2.0.X + mongodb多数据源(账号密码)(77)
        之前在崛起于Springboot2.XMongodb多数据源(35)(https://my.oschina.net/mdxlcj/blog/1928794),结果发现没有用户名和密码,替换之后不管用,然后重新写一个带用户名和密码的多数据源,方便企业级使用,目前适用于2.0.X版本,高版本的话,里面的配置Factory会过期,所以等有
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这