druid-spring-boot 多数据源无法自动识别Driver

zi8p0yeb  于 2022-12-31  发布在  Druid
关注(0)|答案(9)|浏览(347)

多数据源时无法通过url自动识别Driver 导致错误

com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:865)
init datasource error, url: jdbc:sqlite:/data/testing_sqlite.db
java.sql.SQLException: connect error, url jdbc:sqlite:/data/testing_sqlite.db, driverClass org.h2.Driver

配置
application.properties
DataSourceConfig.java

uyhoqukh

uyhoqukh1#

用的什么版本的druid starter

7fyelxc5

7fyelxc52#

找到原因了,下个版本修复。

gev0vcfq

gev0vcfq3#

不过这样处理会带来一个小问题

  • 如果需要使用指定驱动(比如MySQL的驱动5.x和6.x)使用 spring.datasource.driver-class-name 将无效
    比如下面的配置没有使用到配置的错误驱动
spring.datasource.url=jdbc:h2:file:~/.h2/testdb
spring.datasource.driver-class-name=org.sqlite.JDBC

只能通过以下配置才生效

spring.datasource.druid.driver-class-name=org.sqlite.JDBC

应该这么改 DruidDataSourceWrapper

if (super.getDriverClassName() == null) {
    if (StringUtils.hasText(basicProperties.getDriverClassName())) {
        super.setDriverClassName(basicProperties.determineDriverClassName());
    }
}
5n0oy7gb

5n0oy7gb4#

不用了,直接在DruidDataSource初始化(init方法)的时候再进行推断就解决了, this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl); ,https://github.com/alibaba/druid/blob/master/src/main/java/com/alibaba/druid/pool/DruidDataSource.java#L809

放弃使用Spring 的 driverClassName 推断,使用Druid自身的。

fae0ux8s

fae0ux8s5#

我的意思不是自动推断, 而是我要手动设置 spring.datasource.driver-class-name 的时候将会不起作用
所以这么改可以避免

if (super.getDriverClassName() == null) {
    if (StringUtils.hasText(basicProperties.getDriverClassName())) {
        super.setDriverClassName(basicProperties.determineDriverClassName());
    }
}
uajslkp6

uajslkp66#

Url和driverClassName中的数据库类型不一致,这样配是不是有问题?

lyr7nygr

lyr7nygr7#

不同版本的驱动jar包也不一样呀,没明白怎么有这种场景呢

pxiryf3j

pxiryf3j8#

  • Url和driverClassName中的数据库类型不一致只是为了测试 spring.datasource.driver-class-name 是否有效,
    测试结果只有 spring.datasource.druid.driver-class-name 才能覆盖自动检测。
  • 不同版本的驱动jar包也不一样 这是我看 META-INF\services\java.sql.Driver 里的内容不同才说的,比如mysql-connector-java-6.0.6.jar是 com.mysql.cj.jdbc.Driver 不过这个不影响因为 com.mysql.jdbc.Driver 又继承了它。
sqserrrh

sqserrrh9#

哪个版本得到修复呢

相关问题