问题背景与现象分析

在完成产品项目转国产化(mysql->dm8)时遇到报错

分析:SpringBoot项目中同时集成TDengine和DM8数据库时,可能出现驱动冲突、连接池管理混乱或SQL语法兼容性问题。典型表现包括类加载冲突、连接泄漏或查询执行异常。

博主花了很多时间尝试了网上各种办法都无法解决,还有几种尝试过的方法没贴出来,博主只贴出了几种自认可行性强的方法(最终能解决方法在文章末尾)

方法1:给动态数据源配置独立的驱动类加载器

通过配置动态数据源,为达梦和TDengine分别指定独⽴的类加载器,避免驱动类加载冲突,彻底隔离 两者的解析逻辑。修改application.yml(或application.properties)的动态数据源配置

自定义类加载器(以TaosClassLoader为例,达梦同理):

核⼼作用:让达梦驱动和TDengine驱动在各⾃的类加载器环境中运⾏,互不干扰,彻底解决解析逻辑 冲突

方法2:更换达梦驱动版本(规避版本适配问题)

你当前使⽤的达梦Dm8版本(8.1.1.193)对应的DmJdbcDriver18,可能存在与TDengine3.6.0驱动 的适配bug,尝试更换达梦驱动版本,推荐两个适配性较好的版本:

•版本1:DmJdbcDriver18 8.1.2.18(适配Dm88.1.2+,修复了部分JDBC协议兼容问题)

•版本2:DmJdbcDriver11 8.1.1.193(对应达梦JDBC4.1规范,与TDengine驱动的兼容性更好) 修改pom.xml依赖(以更换为8.1.2.18为例)

说明:无需修改其他配置,仅更换达梦驱动版本,⼤概率可解决版本适配导致的解析冲突(亲测多个 项⽬中,达梦8.1.2+驱动与TDengine3.3.x+驱动兼容性更好)

serverIp: 127.0.0.1
spring:
# 关闭 SpringBoot 自动数据源配置
  autoconfigure:
    exclude:
      - com.taosdata.jdbc.springboot.autoconfigure.TaosAutoConfiguration
      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
# 多数据源手动配置
  datasource:
    dynamic:
      primary: dm8
      strict: true
      datasource:
        dm8:
          url: jdbc:dm://${serverIp}:5236/SYSDBA?schema=BASE_CLOUD_WELDMES
          driver-class-name: dm.jdbc.driver.DmDriver
          type: com.alibaba.druid.pool.DruidDataSource
          username: SYSDBA
          password: ******
          druid:
            connect-timeout: 300
            maxPoolPreparedStatementPerConnectionSize: 100
            initialSize: 10
            minIdle: 5
            maxActive: 20
            max-wait: 60000
            min-evictable-idle-time-millis: 300000
            time-between-eviction-runs-millis: 60000
            validation-query: SELECT 1 FROM DUAL
            test-on-borrow: false
            test-on-return: false
            test-while-idle: true
            keep-alive: true
        tdengine:
          driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
          url: jdbc:TAOS-RS://${serverIp}:6041/
          username: root
          password: ******
  redis:
    host: ${serverIp}
    port: 6379
    password: ******
    database: 0
mqtt:
  host: localhost
  port: 1888
  clientId: xxxmes
  username: admin
  password: ******

如果能解决你的问题请大家留个脚印,最后祝大家少遇BUG!!!

更多推荐