当前位置: 首页 > news >正文

springboot 2 Hikari 多数据源配置问题(dataSourceClassName or jdbcUrl is required)

最近在项目中想试一下使用 Hikari 连接池,以前用的是阿里的 Druid,框架是 Spring MVC,xml配置文件方式注入的 Bean,现在换成 Spring Boot 之后,总遇到一些奇怪的问题,问题的根源是在于自己是个半桶水。

好了,先来看看 application.yml 配置文件:

spring:
  jpa:
    show-sql: true
  datasource:
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
    username: root
    password: root
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 20
      max-lifetime: 30000
      idle-timeout: 30000
      data-source-properties:
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048
        cachePrepStmts: true
        useServerPrepStmts: true
    slave:
      url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
      username: root
      password: root
      type: com.zaxxer.hikari.HikariDataSource
      hikari:
        maximum-pool-size: 20
        max-lifetime: 30000
        idle-timeout: 30000
        data-source-properties:
          prepStmtCacheSize: 250
          prepStmtCacheSqlLimit: 2048
          cachePrepStmts: true
          useServerPrepStmts: true
复制代码

数据源配置文件:

package org.seckill.config;

import com.zaxxer.hikari.HikariDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * 数据源配置
 *
 * @author jeftom
 * @date 2019-04-14 12:03
 * @since 1.0.0
 */
@Configuration
public class DataSourceConfig {
	private final static Logger LOGGER = LoggerFactory.getLogger(DataSourceConfig.class);

	@Bean(name = "masterDataSource")
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource masterDataSource(DataSourceProperties properties) {
		LOGGER.info("init master data source:{}", properties);
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "slaveDataSource")
	@ConfigurationProperties(prefix = "spring.datasource.slave")
	public DataSource slaveDataSource(DataSourceProperties properties) {
		LOGGER.info("init slave data source:{}", properties);
		return DataSourceBuilder.create().build();
	}

	@Bean
	@Primary
	public DynamicDataSource dataSource(DataSource masterDataSource, DataSource slaveDataSource) {
		Map<String, DataSource> targetDataSources = new HashMap<>();
		targetDataSources.put(DataSourceEnum.MASTER.getName(), masterDataSource);
		targetDataSources.put(DataSourceEnum.SLAVE.getName(), slaveDataSource);

		return new DynamicDataSource(masterDataSource, targetDataSources);
	}
}
复制代码

报错信息:

com.zaxxer.hikari.HikariConfig           : HikariPool-1 - dataSource or dataSourceClassName or jdbcUrl is required.

java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.
	at com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:955) ~[HikariCP-3.2.0.jar:na]
复制代码

百度了一下找到的解决方法:

  1. url 换成了 jdbc-url;
  2. 增加 driver-class-name: com.mysql.cj.jdbc.Driver

试了一下,果然真的可以。但是,没有使用多数据源时,原来的配置文件也是能正常使用的啊,为什么呢?

问题肯定是出在增加了 DataSourceConfig 这个配置文件之后。

于是试着把配置文件还原回去,再把

return DataSourceBuilder.create().build();
复制代码

改为如下:

		return DataSourceBuilder.create(properties.getClassLoader())
				.type(HikariDataSource.class)
				.driverClassName(properties.determineDriverClassName())
				.url(properties.determineUrl())
				.username(properties.determineUsername())
				.password(properties.determinePassword())
				.build();
复制代码

也就是从配置文件拿到配置值之后重新赋值一下,再次启动项目,居然好了~

原因就是出在 DataSourceBuilder 创建数据源这个类上,而单数据源自动装载时不会出现这样的问题。

相关文章:

  • JAVA 多用户商城系统b2b2c-Spring Cloud Stream 介绍
  • 实现Kubernetes跨集群服务应用的高可用
  • scss rem 转换函数
  • 30K iOS程序员的简述:如何快速进阶成为高级开发人员
  • sysbench安装配置和参数说明
  • Q680 验证回文字符串 Ⅱ
  • python基础知识-12-模块的了解
  • 20175318 2018-2019-2 实验二《Java面向对象程序设计》实验报告
  • 数据可视化之下发图实践
  • PCB单双面板打样工程费跨入30元时代!
  • DLC 基本定律与规则2
  • Netty源码分析(六):SelectedSelectionKeySetSelector
  • 003-Java技术体系
  • vue的事件对象,方法执行
  • CAD图纸转换成高质量的彩色PDF格式如何操作?
  • 【个人向】《HTTP图解》阅后小结
  • AWS实战 - 利用IAM对S3做访问控制
  • Docker: 容器互访的三种方式
  • ERLANG 网工修炼笔记 ---- UDP
  • gitlab-ci配置详解(一)
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript服务器推送技术之 WebSocket
  • MD5加密原理解析及OC版原理实现
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • vagrant 添加本地 box 安装 laravel homestead
  • vue-loader 源码解析系列之 selector
  • Vue学习第二天
  • 汉诺塔算法
  • 聊聊flink的TableFactory
  • 每天10道Java面试题,跟我走,offer有!
  • 区块链技术特点之去中心化特性
  • 入门级的git使用指北
  • 探索 JS 中的模块化
  • 为视图添加丝滑的水波纹
  • 用Visual Studio开发以太坊智能合约
  • 优化 Vue 项目编译文件大小
  • 如何用纯 CSS 创作一个货车 loader
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​渐进式Web应用PWA的未来
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​水经微图Web1.5.0版即将上线
  • "无招胜有招"nbsp;史上最全的互…
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (4) PIVOT 和 UPIVOT 的使用
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (转)Linux下编译安装log4cxx
  • (转)linux下的时间函数使用
  • (转)Sql Server 保留几位小数的两种做法
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 5.0正式发布,有什么功能特性(翻译)