Spring Boot整合达梦数据库的适配改造(国产中间件)

发布于:2025-03-01 ⋅ 阅读:(10) ⋅ 点赞:(0)

1.1 驱动兼容性
错误示例(使用MySQL驱动):

spring:  
  datasource:  
    url: jdbc:mysql://localhost:5236/test  
    driver-class-name: com.mysql.cj.jdbc.Driver

报错信息:
java.sql.SQLException: 不支持的数据库类型

总结:
• 达梦数据库不兼容MySQL协议(与Oracle协议更接近)
• 必须使用官方提供的DmJdbcDriver

Spring Boot 3.4适配全流程
2.1 第一步:引入达梦驱动(版本敏感!)

<!-- pom.xml -->  
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>DmJdbcDriver</artifactId>
    <version>8.1.3.62</version><!-- 必须与达梦版本严格匹配 -->
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/DmJdbcDriver18.jar</systemPath>
</dependency>  

避坑指南:
• 达梦驱动需从官网下载,不能通过Maven中央仓库获取
• 8.1.3.x版本仅支持JDK 17+

2.2 第二步:数据源配置(大小写敏感!)

# application.yml  
spring:
datasource:
    url:jdbc:dm://localhost:5236/TEST?schema=SYSDBA
    driver-class-name:dm.jdbc.driver.DmDriver
    username:SYSDBA
    password:SYSDBA
jpa:
    hibernate:
      ddl-auto:none
    database-platform:org.hibernate.dialect.DmDialect  

关键配置:
• schema=SYSDBA 必须显式指定
• 达梦的Hibernate方言为 DmDialect

2.3 第三步:实体类改造(主键策略大坑)
MySQL版实体类(失效!):

@Entity  
@Data  
public class User {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
}  

达梦适配版(序列+触发器):

@Entity  
@Data
@Table(name = "\"USER\"")// 达梦表名强制大写需转义  
publicclassUser {  
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_user")
    @SequenceGenerator(name = "seq_user", sequenceName = "SEQ_USER_ID")
    private Long id;  
}  

达梦操作:
– 必须手动创建序列
CREATE SEQUENCE SEQ_USER_ID START WITH 1 INCREMENT BY 1;

3.1 坑一:分页查询语法差异
MySQL写法(失效):

@Query(value = "SELECT * FROM user LIMIT ?1 OFFSET ?2", nativeQuery = true)  
List<User> findPage(int limit, int offset); 

达梦改造方案:

@Query(value = "SELECT * FROM \"USER\" OFFSET ?1 ROWS FETCH NEXT ?2 ROWS ONLY",   
       nativeQuery = true)  
List<User> findPage(int offset, int limit);  

3.2 坑二:事务管理器兼容性
传统配置(失效):

@Bean  
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {  
    return new JpaTransactionManager(emf);  
}  

达梦适配方案(必须指定方言):

@Bean  
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {  
    JpaTransactionManager txManager = new JpaTransactionManager();  
    txManager.setEntityManagerFactory(emf);  
    txManager.setJpaDialect(new DmJpaDialect());  // 关键配置  
    return txManager;  
}  

3.3 坑三:监控端点暴雷
Spring Boot Actuator默认配置(报错):

management:  
  endpoints:  
    web:  
      exposure:  
        include: health,info,datasource 

报错信息:
org.springframework.jdbc.BadSqlGrammarException: 执行SQL查询失败

修复方案(禁用不兼容端点):

management:  
  endpoints:  
    web:  
      exposure:  
        include: health,info  

3.4 坑四:连接池参数失效
通用配置(不生效):

spring:  
  datasource:  
    hikari:  
      maximum-pool-size: 20  

达梦专有配置:

spring:  
datasource:
    hikari:
      data-source-properties:
        maxPoolSize:20
        oracle.jdbc.J2EE13Compliant:true//必须开启  

3.5 坑五:JSON序列化异常
现象:

{  
  "createTime": "2024-03-20T14:30:22.123+08:00"  
}  

达梦报错:
DATE类型精度不匹配

解决方案(强制格式化):

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")  
private LocalDateTime createTime;  

性能调优
4.1 连接池监控(Druid专配)

<dependency>  
    <groupId>com.alibaba</groupId>  
    <artifactId>druid-spring-boot-starter</artifactId>  
    <version>1.2.21</version>  
</dependency>  
spring:  
  datasource:  
    druid:  
      filters: stat,wall  
      stat-view-servlet:  
        enabled: true 

4.2 执行计划分析

EXPLAIN  
SELECT * FROM "USER" WHERE name = '张三';  

达梦优化建议:
• 所有查询字段必须显式指定大小写
• 索引列避免使用函数计算


网站公告

今日签到

点亮在社区的每一天
去签到