alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.97k stars 8.58k forks source link

springboot项目引入druid-spring-boot-starter包后,使用hikaricp冲突,无法根据type实现无缝切换 #3392

Open Yaohua-Cai opened 5 years ago

Yaohua-Cai commented 5 years ago

环境: springboot 1.5.21,同时引入druid,hikaricp,log4jdbc,数据库是oracle11g。 压测环境使用hikaricp+log4jdbc,其他环境使用druid,根据profile启动项目。 问题: druid-spring-boot-starter启动会默认初始化DruidDataSourceAutoConfigure,当spring.datasource.type是其他类型时候报错,如下: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceAutoConfigure.class]: Invocation of init method failed; nested exception is java.sql.SQLException: not support oracle driver 1.0 希望能根据type初始化,未设置指定type值不进行初始化。 如下: @ConditionalOnProperty( name = {"spring.datasource.type"}, havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true )

WangChangJuan commented 5 years ago

提这个问题不是难为温少吗? SpringBoot默认支持数据源是 DBCP, TOMCAT-JDBC ,还有光数据源。 你可以要求SpringBoot开发者把Druid加入也可以,或者你自己调整代码编译打包替换sprintboot的包。

Yaohua-Cai commented 5 years ago

提这个问题不是难为温少吗? SpringBoot默认支持数据源是 DBCP, TOMCAT-JDBC ,还有光数据源。 你可以要求SpringBoot开发者把Druid加入也可以,或者你自己调整代码编译打包替换sprintboot的包。

怎么会为难呢?现在是只要引入druid jar包,启动就会加载相关配置,没有还无法启动了。 难道我引入druid就不能用springboot原有的东西了?怎么都感觉有点流氓呀。

Yaohua-Cai commented 5 years ago

hi: 您好像没有明白我的意思,可能我解释的不太清楚。手动重写数据源配置类肯定是可以实现我的需求,但是我本身比较懒,不喜欢写这种重复代码。而且我感觉这个算是个小bug。 以下两个是我的压测和开发环境配置,只有单个数据源。同时引入druid-starter、hikaricp是为了切换环境方便,不用维护多个版本程序。 注意:oracle环境下,druid会与log4jdbc起冲突,所以压测环境中我只能换了个数据源。 在使用压测配置时候,即使指定了type,druid还是会在启动时候初始化。这里由于没有配置druid相关配置就会报错了。 看了下源码,应该就是这里的问题。 像如下代码一样修改一下应该就可以了。

感谢来信,欢迎交流。


Best regards, Kenn.cai(蔡耀华)

Mobile: +86 18019692161

QQ : 785805159

在2019年8月11日 14:51,WangChangJuannotifications@github.com 写道:

直接引入连接池的驱动包,不用starter的方式,给你一个参考实现代码,支持双数据源

@configuration @Profile({"dev"}) public class DataSourceConfig { @value("Spring.primaryDataSource.driver") private String primaryDataSourceDriver; @value("Spring.primaryDataSource.Url") private String primaryDataSourceDriverUrl; @value("Spring.primaryDataSource.user") private String primaryDataSourceUser; @value("Spring.primaryDataSource.password") private String primaryDataSourcePassword;

@Value("Spring.secondDataSource.driver")

private String secondDataSourceDriver;

@Value("Spring.secondDataSource.Url")

private String secondDataSourceDriverUrl;

@Value("Spring.secondDataSource.user")

private String secondDataSourceUser;

@Value("Spring.secondDataSource.password")

private String secondDataSourcePassword;

@Primary

public DataSource primaryDataSource() {

HikariConfig config = new HikariConfig();

config.setJdbcUrl(primaryDataSourceDriverUrl);

config.setDriverClassName(primaryDataSourceDriver);

config.setUsername(primaryDataSourceUser);

config.setPassword(primaryDataSourcePassword);

return new HikariDataSource(config);   

}

@Bean(name = "secondDataSource")

public DataSource secondDataSource() {

DruidDataSource datasource = new DruidDataSource();

datasource.setUrl(secondDataSourceDriverUrl);

datasource.setUsername(secondDataSourceUser);

datasource.setPassword(secondDataSourcePassword);

datasource.setDriverClassName(secondDataSourceDriver);

return datasource;

}

}

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.