软件开发开发多少钱 国产适配之MySQL替换为达梦8数据库

1. 配景

面貌中要作念国产化,MySQL要替换成达梦8数据库。面貌中MySQL的建表语句和内置数据通过.sql文献柔和,安设时会运行化表结构和表内置数据。面貌架构为SpringBoot + JPA / Mybatis。适配责任实质包括数据库移动、数据导出、面貌中的成立革新和关系问题惩处有筹画。

2. 数据处理经过1. 前期装备1. 安设达梦8数据库

达梦官网有提供安设包,字据我方的场景进行采选,linux_x86或者linux_aarch64,由于咱们面貌要全面国产化,是以劳动器用的国产华为的鲲鹏劳动器(aarch64),操作系统为国产星河麒麟V10。安设神色按官网提供的文档就行,下载后安设包里也会有一些PDF施展文档可参考。

2. 创建库,启动

安设时如果采选了图形化界面安设,则有DM数据库成立助手器具,可用此器具来创建数据库实例,成立的话中间有个大小写是否明锐成立,此成立默许采选不解锐,不然可能后头会有坑(后头说),安设时铭刻把客户端也选上,后头用其客户端进行操作,其他成立的话默许就行。安设完成后其中默许用户为SYSDBA,默许端口为5236。linux环境创建数据库实例传送:dm实例创建神色

2. 库数据处理

这一步的处理主如果将之前面貌中存储的.sql文献中MySQL的表结构和表数据关系sql调理为达梦数据库所搭救的sql,何况雷同保存为.sql文献,后续面貌运行之前径直用sql文献进行建表导数据等运行化操作。不详念念想如下:

1.先把之前sql文献(MySQL)导入到MySQL数据库中

2.愚弄达梦的数据移动器具把MySQL库中的数据移动到达梦数据库中

3.愚弄达梦数据库移动器具把达梦数据库中的数据导出到sql文献,此时sql文献中的sql语句就可在达梦数据库中实施

1. 数据移动

如果安设时采选安设了客户端器具,则会生成一些客户端操作器具,如移动器具、DM管制器具、SQL交互式查询器具等。迁顷然采选DM数据移动器具,按照器具内的神色,采选MySQL劳动和数据库以及要移动的DM数据库。

图片

1.新建移动,按需采选,我这边是MySQL -> DM。

2.采选数据源迁顷然不错指定Mysql数据库的驱动,成立一下jdbc驱动和聚会参数即可。达梦的话等于用默许驱动即可。

图片

3.移动战略,可采选保抓对象名大小写,如果MySQL中表字段灵验到json类型的字段时,需要手动成立一下类型映射关系,将JSON转成VARCHAR,并竖立长度,因为达梦没不搭救json类型,迁顷然他会默许转成VARCHAR,关联词长度会变得很大(具体健忘了),这时某些场景查询时会报错,成立成8188即可,按图成立即可

图片

图片

4.后头采选移动模式的话全选即可,没什么需要非凡留心的点

2.数据导出

第三步移动完成后,此时达梦数据库也曾有和MySQL同名的库(dm中是schema观念)和表数据了。接下来要把库中的数据导出为.sql文献,到时分放到面貌中安设时用来运行化表及数据。

此时仍然需要用达梦的数据移动器具,新建数据移动,采选数据移动格式为DM -> SQL,然后指定需要移动的数据源(达梦中的scheme),然后导出到指标文献即可。

图片

3. 面貌适配(重心)1. 库名问题

问题:导出后的达梦sql剧本你会发现,建表语句神色为schema.table,何况主键自增关键字造成了IDENTITY。面貌中如果用SYSDBA用户聚会或者别的用户聚会时,实施sql语句皆要加上schema(不错意会为mysql的库名,后续就说库名了),如select * from “MY_DB”.“T_USER_TEST”,如不加库名则会报错,天然不可能把面貌中悉数的sql皆改一遍

-- mysql
CREATE TABLE `T_USER_TEST`
(
 "id" BIGINT NOT NULL AUTO_INCREMENT,//主键自增
 "name" VARCHAR(255) NULL
);
-- 达梦
CREATE TABLE "MY_DB"."T_USER_TEST"
(
 "id" BIGINT IDENTITY(1,2) NOT NULL,//主键自增
 "name" VARCHAR(255) NULL
);

惩处有筹画:创建一个用户,用户名为库名,创建用户后达梦会自动创建一个和用户名相通的库,此时用此用户登录聚会,实施sql语句时表名前边就不需要加库名了,因为他默许查的等于此用户下的库。语句如下(包括创建表空间、赋权等),后续聚会时使用此账号和密码以及url聚会中的schema(MY_DB)

-- 创建表空间MY_DB
CREATE tablespace MY_DB DATAFILE 'MY_DB.DBF' SIZE 128;
-- 创建用户MY_DB,密码为123456,软件开发开发多少钱此时会自动创建名为MY_DB的schema
CREATE USER "MY_DB" IDENTIFIED BY "123456" DEFAULT tablespace MY_DB;
-- 为MY_DB用户赋权
grant "DBA","RESOURCE","PUBLIC","SOI" to "MY_DB" with admin option;
grant EXECUTE on "SYS"."DBMS_XMLGEN" to "MY_DB";

Spring数据库聚会成立参考:

#dm8聚会
spring.datasource.url=jdbc:dm://127.0.0.1:5236/MY_DB
spring.datasource.username=MY_DB
spring.datasource.password=123456
spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#如果面貌中有使用到JPA,参考如下方言成立
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DmDialect
spring.jpa.properties.hibernate.hbn2ddl.auto=none
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
2. 主键自增问题1. 问题瓦解

最初,达梦数据库是搭救主键自增的,DDL中自增关键字为IDENTITY,假如咱们表中的id字段竖立的为自增id,insert语法常见如下三种:

-- 如下建表语句,id为自增id
CREATE TABLE "MY_DB"."t_user_test"
(
 "id" BIGINT IDENTITY(1,2) NOT NULL,//主键自增
 "name" VARCHAR(255) NULL
);

-- 1.insert的正确姿势,此时会生成则增id
insert into "t_user_test"(name) values("tom");

-- 2.失实示范,此时会报错:仅当指定列列表,且SET IDENTITY_INSERT为ON时,智力对自增列赋值
insert into "t_user_test"(id,name) values(1,"tom");
-- 3.失实示范,此时会报错: 仅当指定列列表,且SET IDENTITY_INSERT为ON时,智力对自增列赋值或者违背列[id]非空拘谨
insert into "t_user_test"(id,name) values(null,"tom");

1.第一种插入没问题,无可厚非

2.第二种插入会报错,道理等于说,你的id竖立的为自增列,关联词你插入时对自增列手动赋值,这是不允许的,竖立了自增就应该用数据库的自增生成。关联词面貌中不免有手动竖立id插入的场景,此时亦然有惩处有筹画的,等于在插入之前竖立IDENTITY_INSERT为ON。留心IDENTITY_INSERT关键字是表级别的关键字,语法要指定到表,不成对全库进行竖立。

-- 竖立t_user_test表
SET IDENTITY_INSERT MY_DB.t_user_test ON
insert into("id","name") values(1,"tom");
-- OFF不错演叨施,不影响
SET IDENTITY_INSERT MY_DB.t_user_test OFF

针对IDENTITY_INSERT问题,本东谈主作念了一些测试,得出以下论断供参考:

如需要使用数据库主键自增特质,需要在主键列上声明IDENTITY

当insert语句时,如果手动竖立id值,则需要竖立此表的IDENTITY_INSERT为 ON

实施完不关闭(SET IDENTITY_INSERT MY_DB.t_user_test OFF),再次插入id为空的值照旧不错自增的

不同会话之间实施SET IDENTITY_INSERT MY操作不会相互影响

统一会话统一技艺只可有一张表IDENTITY_INSERT 竖立为ON,后头会粉饰前边的,统一会话屡次竖立独一临了一次竖立奏效

当insert语句中,如果id泄漏插入,何况value为null,则会报非空拘谨的问题

开启语句:SET IDENTITY_INSERT db.table ON

上期龙头开出奇数球05,近10期龙头开出07 04 06 04 05 02 08 01 01 05,奇偶比5:5,本期参考奇数球05。

关闭语句:SET IDENTITY_INSERT db.table OFF

3.第三种插入报错很较着,当你莫得竖立IDENTITY_INSERT时,他会先报错让你对其竖立为ON,如果竖立完后就会报错违背id非空拘谨,因为id建表时为主键,自带非空拘谨。不成泄漏插入null值,此种失实只可对sql进行处理,后头会讲。

2. 问题处理

经过以上问题分析,insert某张表时,不错先竖立IDENTITY_INSERT为ON,天然独一第一种insert不需要竖立,不错径直走自增,关联词你竖立后也不会影响insert的实施,为了偷懒不想整理面貌中的sql,索性悉数insert皆竖立IDENTITY_INSERT为ON。天然你不错写sql,修改面貌中的代码,在悉数insert操作之前皆实施一遍INDENTITY_INSERT ON,关联词代码中抓久层框架用了JPA和Mybatis,何况此类sql许多,是以接管AOP的格式惩处。

appJPA

惩处念念路:在咱们面貌中使用JPA保存对象完了插入皆是转折调用JpaRepository.save()步调软件开发开发多少钱,是以在此步调加一层逼迫处理就行了,实施save之前先实施SET IDENTITY_INSERT ON,参考代码如下:

@Aspect
@Component
public class JpaSaveAspect {

    public static final String IDENTITY_INSERT_ON = "SET IDENTITY_INSERT MY_DB.%s ON";
    public static final String IDENTITY_INSERT_OFF = "SET IDENTITY_INSERT MY_DB.%s OFF";

    @Autowired
    private JdbcTemplate jdbcTemplate;

   // 节点为JpaRepository.save
    @Pointcut("execution(* org.springframework.data.jpa.repository.JpaRepository.save(..))")
    public void savePointcut() {
    }

   //实施切点步调之前要进行的处理
    @Before("savePointcut()")
    public void beforeSave(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        if (Objects.isNull(args) 


Powered by 软件开发开发多少钱 @2013-2022 RSS地图 HTML地图

Copyright Powered by365建站 © 2013-2024 云迈科技 版权所有