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

达梦数据库踩坑合集

文章目录

  • 安装达梦设置大小写不敏感
  • Spring boot引入达梦驱动(两种方式)
    • 将jar包打入本地maven仓库
    • 使用国内maven仓库(阿里云镜像)
  • 达梦驱动yml配置
  • springboot + mybatis-plus整合达梦,如何避免指定数据库名,设置指定库的指定数据库
    • 错误信息
    • 解决方案
  • 达梦 + mybatis timestamp、datetime 和 MySQL中的datetime数据类型的映射
    • 问题背景
    • 解决方案
  • 达梦数据库查询数据 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中直接引用

<dependency><groupId>com.dm</groupId><artifactId>DmJdbcDriver18</artifactId><version>1.8</version>
</dependency>

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

maven坐标如下:

<dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version>
</dependency>

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

达梦驱动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.DmDriverurl: jdbc:dm://111.11.11.111:5236/MYDB?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: MYDBpassword: 123456maxPoolSize: 100minPoolSize: 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,或者较短的长度,导入达梦之后需要重新校验一下数据表的参数设置

达梦数据库查询数据 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
@AllArgsConstructor
public class User implements Serializable {private String username;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}

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

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

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));converters.add(0, converter);}}

Error flushing statements. Cause: dm.jdbc.driver.DMException: 当前连接为只读状态

在使用spring boot + mybatis-plus是,将业务实现类xxxImpl的隔离级别写成了

@Transactional(readOnly = true, propagation = Propagation.REQUIRED)

改成

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

真是不可思议,这么久都没发现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/758311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用负载均衡详解

一、介绍 在互联网场景下&#xff0c;负载均衡&#xff08;Load Balance&#xff09;是分布式系统架构设计中必须考虑的一个环节&#xff0c;它通常是指将负载流量&#xff08;工作任务、访问请求&#xff09;平衡、分摊到多个操作单元&#xff08;服务器、组件&#xff09;上去…

Vue 计算属性和watch监听

1.1.计算属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- 引入vue.js --><script src"node_modules/vue/dist/vue.js"></script> </h…

如何在尽量不损害画质的前提下降低视频占内存大小?视频格式科普及无损压缩软件推荐

大家好呀&#xff0c;相比大家都有对视频画质和体积的追求和取舍&#xff0c;那么&#xff0c;如何才能在不牺牲画质的前提下&#xff0c;尽可能的将视频大小降低到极致呢&#xff1f; 首先我们要了解视频的构成&#xff0c;要想降低视频的体积大小&#xff0c;我们可以从以下几…

FITS:一个轻量级而又功能强大的时间序列分析模型

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

MySQL 多表查询强化练习

环境准备 create table dept(id int PRIMARY KEY,dname VARCHAR(50),loc VARCHAR(50) ); insert into dept values (10,研发部,北京), (20,学工部, 上海), (30,销售部,广州 ), (40,财务部,深圳);create table job(id int PRIMARY KEY,jname VARCHAR(20),descripition VARCHAR(…

【web世界探险家】HTML5 探索与实践

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &…

129740-002 是ABB生产的模块吗?

ABB 129740-002是一款智能模拟量输入输出IO模块。 这款模块的主要功能是进行模拟信号与数字信号之间的转换。具体来说&#xff0c;它可以将模拟信号转换为数字信号&#xff0c;也可以将数字信号转换回模拟信号。这一特性使其在工业应用中具有重要作用&#xff0c;尤其是在过程…

Cesium新版修改源码后,编译不生效问题

最新版本的cesium源码在编译时默认使用node_models下的cesium/engine&#xff0c;从而导致咱们修改项目中的源码并不会生效 解决方式 &#xff1a; 进入到实际的源码位置&#xff0c;执行npm link 在返回到源码的根目录下执行 npm link ./packages/engine

vue3 几种实现点击复制链接的方法

vue3 几种实现点击复制链接的方法 环境&#xff1a;vue3tselment plus 目的&#xff1a;常用到的地方就是点击复制分享链接功能 1.复制当前页面链接&#xff0c; <template><div class"news" style"margin-top: 30px"><el-button type&q…

游戏 AI 反作弊|内附解决方案详情!

我们提出使用在游戏中广泛存在的回放日志数据&#xff0c;重构出玩家当局的表现。在回放 日志数据中&#xff0c;我们构建了玩家的时序行为数据&#xff0c;并基于该时序行为数据&#xff0c;分别搭建 了透视和自瞄外挂检测系统&#xff0c;该方法和系统可广泛应用于各种在线…

SAP STMS请求重复传输

STMS 在接请求的导入的时候&#xff0c;第一次发生了错误&#xff0c;在修复了错误之后&#xff0c; 该请求二次导入显示已经该请求已全部导入 可以按如下操作进行再次导入 附加--》其他请求--》添加 输入请求号并勾选再次导入 然后点选需要重复导入的请求号即可再次导入

AI算力池化赋能企业大模型价值探索

1. 大语言模型企业落地中的算力痛点 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;成为了热门的研究领域之一。在这一领域中&#xff0c;大语言模型&#xff08;Large Language Models&#xff09;凭借其强大的语言理解和生成能力&#xff…

学习笔记-华为IPD转型2020:3,IPD的实施

3. IPD的实施 1999 年开始的 IPD 转型是计划中的多个转型项目中的第一个&#xff08;Liu&#xff0c;2015&#xff09;。华为为此次转型成立了一个专门的团队&#xff0c;从大约20人开始&#xff0c;他们是华为第一产业的高层领导。董事会主席孙雅芳是这个团队的负责人。该团…

【Maven】使用maven-jar、maven-assembly、maven-shade优雅的实现第三方依赖一同打Jar包

文章目录 一.前言二.常规Jar 打包&#xff1a;maven-jar-plugin三.Shade 打包&#xff1a;maven-shade-plugin1.如何使用2.将部分jar包添加或排除3.将依赖jar包内部资源添加或排除4.自动将所有不使用的类排除5.将依赖的类重命名并打包进来 &#xff08;隔离方案&#xff09;6.修…

【Linux】项目部署CPU彪高如何定位

1.查看所有CPU占比 使用top指令获取彪高进程的PID 2.输出进程的信息 ps H -eo pid,tid,%cpu | grep 1313 3.查看线程的信息 jstack tid nid都是十六进制的 4.进制转换 将 tid的十进制转为十六进制 找到nid 可以定位到具体位置 5.关闭程序 ps -ef | grep java kill -9 jav…

机器人路径规划:基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(提供Python代码)

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始&#xff0c;采用贪心算法的策略&#…

通过更新路书当前坐标下marker的icon来展示沿途的风景

通过更新路书当前坐标下marker的icon来展示沿途的风景 1.效果图2.[工程链接](https://download.csdn.net/download/m0_61864577/88978866)3.需修改地方: 本文演示了如何通过百度地图的路书功能,展示途经的风景。定时缩放,既有全局路径,又有当前位置和运动轨迹;可以显示当前坐标…

万界星空科技铜拉丝行业生产管理MES系统

铜拉丝加工作为金属加工行业中的一个重要分支&#xff0c;在国内乃至全球工业领域都扮演着不可或缺的角色。特别是在高导材料领域&#xff0c;铜拉丝加工更是发挥着重要作用。 铜作为一种传统的金属材料&#xff0c;其拉丝加工技术早在古代就有应用。随着工业化进程的加快&…

综合练习(python)

前言 有了前面的知识积累&#xff0c;我们这里做两个小练习&#xff0c;都要灵活运用前面的知识。 First 需求 根据美国/英国各自YouTube的数据&#xff0c;绘制出各自的评论数量的直方图 第一版 import numpy as np from matplotlib import pyplot as plt import matplo…

Flutter Widget:State 状态管理

响应式的编程框架永恒的主题——“状态(State)管理” 无论是在 React/Vue/Flutter 中讨论的问题和解决的思想都是一致的。 StatefulWidget的状态应该被谁管理&#xff1f;Widget本身&#xff1f;父 Widget &#xff1f;都会&#xff1f;还是另一个对象&#xff1f; 下面是官…