KOCA适配高斯数据库
简介
高斯数据库基于postgresql开发,在此基础上扩充了很多高可用的能力,并依据国内应用场景,设计开创落地实践许多方案
高斯数据库主要兼容postgresql语法,对mysql、oracle语法兼容并不完善
适配postgresql
sql脚本
建议在oracle脚本基础上转换
oracle中给字段设置check、加索引、加备注、加外键和postgresql语法基本一致,区别较小,可以减少很多工作量
1、字段类型转换
oracle - postgresql 基础字段转换表,此处仅本人修改字段:
oracle字段 | postgresql |
---|---|
char | char |
nvarchar、nvarchar2 | varchar |
integer | integer |
datetime、date | timestamp |
number | numeric 或 int4 或 int8 或 bigint 或 boolean |
blob | bytea |
clob | text |
注:
- 日期时间丢精度异常:
oracle中date可以存储日期和时间,postgresql中date只存日期,sql脚本、代码运行不会出现异常,存储的数据会从 “2022-6-15 15:17:32” 变成 “2022-6-15 00:00:00”,丢失时间
修复方式:将字段类型改为timestamp,mybatis中dao.xml对应jdbcType=DATE删掉
类型转换异常:postgresql在执行sql时,对字段类型敏感,部分类型不会进行自动转换,sql脚本跑通后,需程序运行,做进一步检测
异常示例1:
字段 a 类型 numeric(1,0)
select * from test where a=true
异常信息:
操作符不存在: integer = boolean varying
Hint: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.
将字段 a 类型修改为 boolean 即可
异常示例2:
字段 b 类型 varchar
select * from test where b=3
异常信息:
SQL 错误 [42883]: 错误: 操作符不存在: character varying = integer
Hint: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.
修改字段 b 类型为 integer 可解决
或修改 sql 中传递的数据类型如下可解决
select * from test where b='3'
2、创建序列
例子
CREATE sequence SEQ_JOB_SCHEDULE_FLOW
minvalue 1
MAXVALUE 99999999999
START WITH 1
increment BY 1
nocache;
转为
CREATE sequence SEQ_JOB_SCHEDULE_FLOW
minvalue 1
MAXVALUE 99999999999
START WITH 1
increment BY 1;
3、自定义函数
示例
Oracle创建函数
CREATE OR REPLACE FUNCTION KOCA_CONCAT(str VARCHAR, str1 VARCHAR) RETURN VARCHAR
IS
BEGIN
return str || str1;
END;
转为
Postgresql创建函数
CREATE OR REPLACE FUNCTION KOCA_CONCAT(str VARCHAR default '', str1 VARCHAR default '')
RETURNS VARCHAR as $$
BEGIN
RETURN str || str1;
END;$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION KOCA_CONCAT(str VARCHAR default '', str1 int8 default 0)
RETURNS VARCHAR as $$
BEGIN
RETURN str || str1;
END;$$ LANGUAGE plpgsql;
注:
Postgresql自定义函数的参数,数据类型敏感,部分类型不会自动转换
Mybatis
1、对齐 koca-mybatis 中 Postgresql 定义
mybatis相关信息
@Bean
@ConditionalOnMissingBean(name = "databaseIdProvider")
VendorDatabaseIdProvider databaseIdProvider() {
VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
properties.setProperty("Microsoft SQL Server", "mssql");
properties.setProperty("Oracle", "oracle");
properties.setProperty("MySQL", "mysql");
//达梦数据库适配
properties.setProperty("DM DBMS", "oracle");
//PostgreSQL适配
properties.setProperty("PostgreSQL","postgres");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
2、Dao.xml中增加对应databaseId=postgres代码块
示例:
<sql id="koca_stringAggregate" databaseId="postgres">
(select array_to_string(array_agg(${FIELD}), ',') ${FROM})
</sql>
注:
Dao.xml中,jdbcType可能带来类型转换异常
示例1:Postgresql中无CLOB,执行异常
<result column="detail" property="detail" jdbcType="CLOB"/>
解决方法:
<result column="detail" property="detail"/>
示例2:字段类型为 integer ,jdbcType="VARCHAR",执行异常
解决方法:
jdbcType="INTEGER"
定时任务
增加Quartz配置
quartz:
scheduler:
instanceName: KOCAScheduler #调度器实例名
instanceId: AUTO #实例ID 默认AUTO
threadPool:
class: org.quartz.simpl.SimpleThreadPool #使用ThreadPool的实现的名字,默认org.quartz.simpl.SimpleThreadPool
threadCount: 10 #并行执行job可用的线程数,默认10
threadPriority: 5 #线程优先级,1——10之间任意整数,默认为5.
properties:
org:
quartz:
jobStore:
driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate #postgresql新增
适配高斯数据库
异常记录
1、高斯数据库不支持外键
GAUSS-04682: “FOREIGN KEY … REFERENCES constraint is not yet supported.”
SQLSTATE: 0A000
错误原因:特性不支持。
解决办法:不建议使用。
https://support.huaweicloud.com/errorcode-dws/dws_08_0517.html
2、创建 unique 失败:
alter table ACT_RE_PROCDEF add constraint ACT_UNIQ_PROCDEF unique (KEY_,VERSION_, DERIVED_VERSION_, TENANT_ID_);
异常信息:
ERROR:Cannot create index whose evaluation cannot be enforced to remote nodes
解决方法:建表时,设置分布列
示例:
create table ACT_GE_PROPERTY (
NAME_ varchar(64),
VALUE_ varchar(300),
REV_ INTEGER,
primary key (NAME_)
) DISTRIBUTE BY REPLICATION;
分布列说明:
CREATE TABLE_云数据库 GaussDB (for openGauss)_开发指南_SQL参考_SQL语法_华为云 (huaweicloud.com)
JDBC驱动说明:
使用JDBC连接数据库_云数据库 GaussDB (for openGauss)_快速入门_使用驱动连接实例_华为云 (huaweicloud.com)
笔者在 maven 仓库中上传了 gsjdbc4.jar,坐标为:
<dependency>
<groupId>org.opengauss</groupId>
<artifactId>opengauss-jdbc-gsjdbc4</artifactId>
<version>2.0.0</version>
</dependency>