小工具知识网

当前位置: 首页 > 行业知识 > mysql迁移达梦数据库 Java踩坑合集

行业知识

mysql迁移达梦数据库 Java踩坑合集

2026-10-27 09:34:34 来源:互联网转载

达梦数据库踩坑合集

文章目录

  • 安装达梦设置大小写不敏感
  • Spring boot引入达梦驱动(两种方式)
    • 将jar包打入本地maven仓库
    • 使用国内maven仓库(阿里云镜像)
    • 达梦驱动yml配置
    • springboot + mybatis-plus整合达梦,如何避免指定数据库名,设置指定库的指定数据库
      • 错误信息
      • 解决方案
      • 达梦 + mybatis timestamp、datetime 和 MySQL中的datetime数据类型的映射
        • 问题背景
        • 解决方案
        • 达梦TEXT数据类型在Java中不能映射为String类型
          • 错误信息
          • 解决方案
          • 达梦数据库将TEXT类型的字段更改为VARCHAR失败
            • 错误信息
            • 解决方案
            • 达梦数据库查询数据 No serializer found for class dm.jdbc.a.a.a and no properties discovered to create BeanSerializer
              • 错误原因
              • 解决方式
              • Error flushing statements. Cause: dm.jdbc.driver.DMException: 当前连接为只读状态
              • 参考博客

                安装达梦设置大小写不敏感

                达梦的大小写敏感设置,只能在安装的时候设置好,安装完成之后不可更改。我是用的是docker安装。在环境变量里设置"-e CASE_SENSITIVE=0",命令如下:

                docker run -tid -p 5236:5236 --restart=always --name dm8 --privileged=true -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e INSTANCE_NAME=dm8 -e CASE_SENSITIVE=0 -v /dm8_docker/data:/opt/dmdbms/data dm8_single:dm8_20230808_rev197096_x86_rh6_64

                如果已经安装了,并且是大小写敏感的。需要将容器停止,然后删除容器,并将挂载目录(这里是 /dm8_docker/data)下的文件一起删掉。再重新执行以上命令。

                # 进入容器: docker exec -it 7ccc57b47de3 /bin/bash# 进入数据库: /opt/dmdbms/bin/disql# 输入超级管理员账号和密码# 达梦默认的账号密码是:# username:SYSDBA# password: SYSDBA001

                附上官网截图:

                Spring boot引入达梦驱动(两种方式)

                将jar包打入本地maven仓库

                1. 从官网下载对应版本的jar包(官网:https://eco.dameng.com/document/dm/zh-cn/app-dev/),选择对应的语言、版本号和技术栈,我这里使用的是mybatis-plus。

                2. 下载好之后,解压压缩包,进入压缩包文件夹

                3. 在地址栏输入cmd,进入命令行,输入打包命令

                mvn install:install-file -Dfile=DmJdbcDriver18.jar -DgroupId=com.dm -DartifactId=DmJdbcDriver18 -Dversion=1.8 -Dpackaging=jar

                出现build success即为成功。

                本地仓库中存在了,即可在pom中直接引用

                    com.dm    DmJdbcDriver18    1.8

                使用国内maven仓库(阿里云镜像)

                maven坐标如下:

                   com.dameng   DmJdbcDriver18   8.1.1.193

                拉取完成即可配置达梦数据库驱动。

                达梦驱动yml配置

                起因:

                因为当前项目是基于MySQL数据做的,中途需要做信创,所以对达梦做的兼容。本人马大哈,一直启动不起来,报找不到达梦驱动 Caused by: java.lang.ClassNotFoundException: com.dm.jdbc.Driver 。

                解决:

                找了很多别人的yml配置,才发现自己把驱动的类名写错了。

                错误写法:com.dm.jdbc.Driver

                正确写法:dm.jdbc.driver.DmDriver

                #   达梦数据库连接配置  datasource:    driver-class-name: dm.jdbc.driver.DmDriver    url: jdbc:dm://111.11.11.111:5236/MYDB?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai    username: MYDB    password: 123456    maxPoolSize: 100    minPoolSize: 5

                另外,还需要注意的是,url的配置,前缀是jdbc:dm//,因为我直接把mysql的配置C过来了,然后报错ERROR [com.alibaba.druid.pool.DruidDataSource] - create connection SQLException, url: jdbc:mysql://111.11.11.111:5236/MYDB?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai, errorCode 0, state null 。

                啊!我真菜!

                springboot + mybatis-plus整合达梦,如何避免指定数据库名,设置指定库的指定数据库

                错误信息

                无效的表或视图名

                ### Cause: dm.jdbc.driver.DMException: 第1 行附近出现错误:无效的表或视图名[t_authentication]; 第1 行附近出现错误:无效的表或视图名[t_authentication]; nested exception is dm.jdbc.driver.DMException: 第1 行附近出现错误:无效的表或视图名[t_authentication]

                将SQL放入达梦管理工具查询:

                查询的表无法确认是哪一个模式中的,所以需要指定每一个实体的对应模式。

                解决方案

                如果在代码中每个去加模式名或视图名,那么代码和数据库的绑定关系过于紧密,不符合开发常识。

                达梦数据库中一个数据库用户创建之后会自动生成一个默认的模式,默认模式名与用户名相同。使用默认模式名,可以避免在mybatis中的操作均需要加上模式名。

                所以我们需要创建一个和模式名(库名)相同的用户,使用新建的用户登录,来访问对应的模式(库)。

                • 创建用户,在达梦管理工具的【用户】栏下,选择【管理用户】,右键,选择【新建用户】
                • 填写好用户名(对应模式名,保持一致)、密码,配置用户角色和系统权限等信息即可。
                • 使用新建的用户登录连接,即可看见对应名称的模式(库),然后在改模式下创建我们需要的数据表,完成之后,就可以不用添加模式前缀名,访问默认模式中的数据了。

                  达梦 + mybatis timestamp、datetime 和 MySQL中的datetime数据类型的映射

                  问题背景

                  因为项目原有的数据库为MySQL数据库,里面的create_time和update_time等字段均为datetime数据类型,对应Java的数据类型为Date()。

                  现在将MySQL的数据通过达梦数据迁移工具,将部分表导入到达梦,达梦中的日期类型就全都变为timestamp类型,导致mybatis在对数据进行新增时,默认日期字段的精度会在时分秒的后面拼接一个.023这类的数字。出现如下错误:

                  ClassTempItemValueMapper.insert (batch index #1) failed. Cause: java.sql.BatchUpdateException: 字符串截断; 字符串截断; nested exception is java.sql.BatchUpdateException: 字符串截断org.springframework.dao.DataIntegrityViolationException: com.ccnest.common.core.classtemp.mapper.ClassTempItemValueMapper.insert (batch index #1) failed. Cause: java.sql.BatchUpdateException: 字符串截断; 字符串截断; nested exception is java.sql.BatchUpdateException: 字符串截断

                  解决方案

                  将达梦中的timestamp数据类型改为DATETIME

                  对象实体中为:

                      /**     * 创建时间     */    @TableField(value = "created_time", fill = FieldFill.INSERT)    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")    private Date createdTime;    /**     * 更新时间     */    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")    private Date updatedTime;

                  字符串截断的问题,还有可能是导入的时候,达梦将某些数据的字符串长度识别为1,或者较短的长度,导入达梦之后需要重新校验一下数据表的参数设置。

                  达梦TEXT数据类型在Java中不能映射为String类型

                  错误信息

                  ### Cause: dm.jdbc.driver.DMException: 第1 行附近出现错误:数据类型不匹配; 第1 行附近出现错误:数据类型不匹配; nested exception is dm.jdbc.driver.DMException: 第1 行附近出现错误:数据类型不匹配

                  解决方案

                  为保持MySQL和达梦对应Java中的数据类型不变,所以我这里采用的是修改达梦的字段数据类型为VARCHAR。

                  附上Java与达梦数据类型映射表,如下(供参考)

                  达梦数据库将TEXT类型的字段更改为VARCHAR失败

                  错误信息

                  错误消息: 第1 行附近出现错误:数据类型的变更无效

                  解决方案

                  1、将字段删除重新加(弊端,非空情况,可能删不掉已存在的数据)

                  2、将数据备份出来,删除表,重新创建表,并导入数据

                  • 将所需表的数据全都查询出来
                  • ctrl+A 全选,右键选择【导出所有】
                    • 将需要删除的表的DDL拷贝出来
                    • 将需要改为TEXT数据类型的定义改为VARCHAR

                      达梦数据库查询数据 No serializer found for class dm.jdbc.a.a.a and no properties discovered to create BeanSerializer

                      完整错误信息如下:

                      Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class dm.jdbc.a.a.a and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.ccnest.base.aop.ResponseResult["data"]->com.baomidou.mybatisplus.extension.plugins.pagination.Page["records"]->java.util.ArrayList[0]->com.ccnest.common.core.flow.entity.vo.FlowNodeInstanceListVO["nodeVOs"]->java.util.HashMap["aafcf027e36c3cbb86e35abf88ee7425"]->java.util.ArrayList[0]->com.ccnest.common.core.flow.entity.vo.FlowNodeInstanceVO["itemValueList"]->java.util.ArrayList[0]->com.ccnest.common.core.flow.entity.vo.ItemValueVO["value"]->dm.jdbc.driver.DmdbNClob["connection"]->dm.jdbc.driver.DmdbConnection["dbAccess"]->dm.jdbc.a.a["b"])at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:46)at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:29)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:808)at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:764)at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:720)at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:35)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1518)at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1007)at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:456)

                      错误原因

                      因为Jackson在序列化的时候无法对值进行读写了

                      解决方式

                      1、修改yml配置

                      这个方法对于我的项目中无效。

                      spring:  jackson:     serialization:         FAIL_ON_EMPTY_BEANS: false # 关闭

                      2、给传递的实体增加getter()和setter()方法,并加上有参构造和无参构造,例如:

                      import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;@Data@NoArgsConstructor@AllArgsConstructorpublic class User implements Serializable {    private String username;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }}

                      但是对于我的项目也没有生效。

                      3、使用自定义的HttpMessageConverter(亲测可用)

                      @Configurationpublic class WebConfig implements WebMvcConfigurer {    @Override    public void extendMessageConverters(List

上一篇:本地服务器怎么备案网站?

下一篇:怎么开通京东服务器地址?