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=SYSDBAdriver-class-name:dm.jdbc.driver.DmDriverusername:SYSDBApassword:SYSDBA
jpa:hibernate:ddl-auto:nonedatabase-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:20oracle.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 = '张三';
达梦优化建议:
• 所有查询字段必须显式指定大小写
• 索引列避免使用函数计算