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 = '张三';
达梦优化建议:
• 所有查询字段必须显式指定大小写
• 索引列避免使用函数计算