MySQL迁移到KingBase操作说明

/ 0条评论 / 0 个点赞 / 1769人阅读

jar更改

maven pom.xml文件

新增

<dependency>
<groupId>kingbase</groupId>
<artifactId>kingbase8</artifactId>
<version>8.2.0</version>
</dependency>

版本变更

<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>4.0.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.dialect</groupId>
<artifactId>hibernate-dialect</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>

配置文件更改

dbconfig.properties

jdbc.driverClassName=com.kingbase8.Driver
hibernate.dialect=org.hibernate.dialect.Kingbase8Dialect
jdbc.url.zxlhdata=jdbc:kingbase8://127.0.0.1:54321/DB_USER?currentSchema=DRMS_USER_423
jdbc.username.zxlhdata=SYSTEM
jdbc.password.zxlhdata=123456
jdbc.dbType=kingbase

链接参数说明

jdbc.url.zxlhdata=jdbc:kingbase8://IP:端口/数据库名称?currentSchema=当前模式名

spring-mvc-hibernate.xml

新增一项

<property name = "driverClassName" value = "${jdbc.driverClassName}" />

修改一项

<prop key="hibernate.dialect">org.hibernate.dialect.Kingbase8Dialect</prop>

自定义或重新函数

-- 新增date_format、YEARWEEK、GROUP_CONCAT、YEAR函数
-- 重写to_char、SYSDATE 函数
-- 每个函数名前都添加了模式名,如果不加模式名默认会添加到PUBLIC模式下,jdbc指定模式名的情况下会找不到函数
 
CREATE or REPLACE FUNCTION "DRMS_USER_423"."date_format"(anyelement,TEXT) RETURNS TEXT 
AS
BEGIN
  IF $2='%Y' THEN
    RETURN to_char($1,'YYYY');
  ELSEIF $2='%Y-%m-%d' THEN
    RETURN to_char($1,'YYYY-MM-DD');
  ELSEIF $2='%Y-%m' THEN
    RETURN to_char($1,'YYYY-MM');
  ELSEIF $2='%m' THEN
    RETURN to_char($1,'MM-DD');
  ELSEIF $2='%d' THEN
    RETURN to_char($1,'DD');
  ELSEIF $2='%Y-%m-%d %H:%i:%s' THEN
    RETURN to_char($1,'YYYY-MM-DD  HH24:MI:SS');
  ELSEIF $2='%Y-%m-%d %h:%i:%s' THEN
    RETURN to_char($1,'YYYY-MM-DD  HH24:MI:SS');
  END IF;
  RETURN to_char($1,'YYYY-MM-DD');
END;
 
 
CREATE or REPLACE FUNCTION "DRMS_USER_423"."to_char"(anyelement,TEXT) RETURNS TEXT 
AS
BEGIN
  IF $2='%Y' THEN
    RETURN to_char($1,'YYYY');
  ELSEIF $2='%Y-%m-%d' THEN
    RETURN to_char($1,'YYYY-MM-DD');
  ELSEIF $2='%Y-%m' THEN
    RETURN to_char($1,'YYYY-MM');
  ELSEIF $2='%m' THEN
    RETURN to_char($1,'MM-DD');
  ELSEIF $2='%d' THEN
    RETURN to_char($1,'DD');
  ELSEIF $2='%Y-%m-%d %H:%i:%s' THEN
    RETURN to_char($1,'YYYY-MM-DD  HH24:MI:SS');
  ELSEIF $2='%Y-%m-%d %h:%i:%s' THEN
    RETURN to_char($1,'YYYY-MM-DD  HH24:MI:SS');
  END IF;
  RETURN to_char($1,'YYYY-MM-DD');
END;
 
-- YEARWEEK()
CREATE or REPLACE FUNCTION "DRMS_USER_423"."YEARWEEK"(anyelement) RETURNS TEXT 
AS
BEGIN
  RETURN 'SELECT EXTRACT(year FROM TIMESTAMP $1)||EXTRACT(week FROM TIMESTAMP $1)';
END;
 
 
-- 自定义实现SYSDATE()
CREATE or REPLACE FUNCTION "DRMS_USER_423"."SYSDATE"() RETURNS TEXT 
AS
BEGIN
  RETURN to_char(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS');
END;
 
-- 自定义实现GROUP_CONCAT(列名)
CREATE or REPLACE FUNCTION "DRMS_USER_423"."GROUP_CONCAT"(anyelement) RETURNS TEXT 
AS
BEGIN
  RETURN wm_concat($1);
END;
 
-- 自定义实现year(时间)
CREATE or REPLACE FUNCTION "DRMS_USER_423"."year"(anyelement) RETURNS TEXT 
AS
BEGIN
  RETURN to_char($1,'YYYY');
END;
 
-- 自定义实现subtring_index(原字符串、分隔字符、保留几个串)
CREATE or REPLACE FUNCTION "DRMS_USER_423"."substring_index"(text,text,INTEGER) RETURNS TEXT 
AS
BEGIN
  IF instrb($1, $2, 1,$3)>0 THEN
    RETURN left($1,(instrb($1, $2, 1,3)-1));
  END IF;
  RETURN '';
END;

java Web项目代码更改

1、sql中包含`符号需要替换掉
2、group by按照标准sql书写
3、convert(group_ver,SIGNED)函数需要改成cast(group_ver as DECIMAL)  kingbase里面没有signed、unsigned类型 所以针对这个类型的转换统一转成cast(group_ver as DECIMAL)  这个函数几个数据库都适用
4、需要注意的一点在mysql中排序的时候null默认是最小的,在kingbase里面null默认是排序最大值
6、其他待发现的问题处理,处理完事归集到文档中来。。。
7、在转换cast的时候出现很多cast(*** as signed 或者是unsigned int 的形式,这种统一成DECIMAL 三个库都支持,kingbase 没有signed或者unsigned类型)
8、select * from t_b_cul_depot where deltag<>'1' and is_use='1' and superid=''  and depot_type = '0'  order by sort asc superid='' 这种写法有问题 没有判断null的情况这种情况在代码里面有不少
9、left join 问题 mysql 支持LEFT JOIN (TABLE1,TABLE2,TABLE3) ON TABLE1.ID= TABLE2.ID … kingbase不支持需要单独处理成类似如下这种形式
ddSql.append(" LEFT JOIN ");
ddSql.append(" t_b_cul_core_bdata" + isVer + " ON ");
if("_ver".equals(isVer)) {
ddSql.append(" "+detailTableName+".CID =  t_b_cul_core_bdata_ver.CID ");
ddSql.append(" and "+detailTableName+".DATA_VER = t_b_cul_core_bdata_ver.DATA_VER ");
ddSql.append(" LEFT JOIN t_b_cul_core_mdata_ver ON t_b_cul_core_bdata_ver.id = t_b_cul_core_mdata_ver.id ");
ddSql.append(" LEFT JOIN t_b_cul_core_odata_ver ON t_b_cul_core_mdata_ver.id = t_b_cul_core_odata_ver.id ");
}else {
ddSql.append(" "+detailTableName+".CID =  t_b_cul_core_bdata.ID ");
ddSql.append(" LEFT JOIN t_b_cul_core_mdata ON t_b_cul_core_bdata.id = t_b_cul_core_mdata.id ");
ddSql.append(" LEFT JOIN t_b_cul_core_odata ON t_b_cul_core_mdata.id = t_b_cul_core_odata.id ");
}
10、sql查询过程中自定义的别名不要出现数据库关键字。例:select js.字段名 as year ,多见于统计年份
11、kingbase数据库char存储是按照定长存储,不够的自动填充空字符,sql查询出来之后会带上缺少的空字符,比对的时候会出问题,变长字符串没有这个问题
12、kingbase 分组查询不能将上级查询结果放到子查询中作为条件

kingbase迁移mysql修改

1、 修改配置文件spring-mvc-hibernate.xml 有两个地方,jdbc和hibernate
删除一项
<property name = "driverClassName" value = "${jdbc.driverClassName}" />
修改一项
<prop key="hibernate.dialect">org.hibernate.dialect.Kingbase8Dialect</prop>这个改成mysql对应的
org.hibernate.dialect.MySQLDialect
 
2、 然后就是pom文件修改版本
hibernate-commons-annotations  版本   改成4.0.1.Final
hibernate-core 版本  4.1.1.Final
去掉hibernate-dialect
hibernate-jpa-2.1-api  名称  改为  hibernate-jpa-2.0-api    版本改为  1.0.1.Final (这个有多个地方)

解决金仓数据库的查询不出来筛选条件为空字符串的记录的问题

从mysql数据库中迁移到kingbase后,<>'0' 的条件不能查询到为null的数据,需要将ora_input_emptystr_isnull 设置为 off

在客户端连接工具执行如下语句,发现结果是on,即配置了服务识别空字符串自动为空的设置

show ora_input_emptystr_isnull

修改安装路径下的/data/kingbase.conf,添加如下配置

ora_input_emptystr_isnull = on

保存,重启数据库服务即可

//重启数据库指令
//在安装目录/Server/bin/下执行
sys_ctl restart - D /你的data路径

查看数据库兼容语法

show database_mode;