# OceanBase for Oracle项目化适配

北京致远互联软件股份有限公司 2024年07月

OceanBase for Oracle顾名思义就是OceanBase数据库厂商兼容Oracle语法的数据库方案,该数据库目前未标准化,只是项目化支持。

项目化支持,意味着可能存在项目化适配成本,可能存在缺陷,并且后续产生的BUG可能需要额外项目化成本解决

# 部署示例

OA版本:A8-N v8.2SP1(BuildID20240509)

中间件:东方通7.0.4.9

OceanBase数据库版本:OceanBase V2.4.9 兼容Oracle模式

[select * from v$version;]内部版本查询结果:

1721284652390.png

# 数据库信息

数据库连接URL格式:jdbc:oceanbase://host:port/?useCompatibleMetadata=true&compatibleOjdbcVersion=8
数据库驱动类:com.oceanbase.jdbc.Driver
JDBC DatabaseMetaData.getDatabaseProductName()返回值:Oracle
数据库内核:自研
数据库兼容性:高度兼容Oracle

# 操作步骤

# 1、数据库安装

数据库安装由OceanBase厂商完成,我们需要等待厂商安装完成后进行数据库脚本的导入,注意告知厂商安装Oracle模式的库。

# 2、准备产品的Oracle数据库脚本

# 2-1、老客户:数据库厂商转库处理

如果是老客户,需要做第三方数据库转库操作:这个由三方数据库厂商解决,我们需要提供的是老客户原始数据库的备份文件,以及我们针对不同场景的字段类型结构,方便厂商做转库判断。

如果老客户原本就是标准的Oracle,也同样联系OceanBase厂商确认是否存在转换的操作。

以下是标准产品不同数据类型、字段的映射关系,可以提供给第三方数据库厂商参考,如厂商不需要,可忽略本步操作:

MYSQL ORACLE SQLSERVER POSTGRESQL JAVA POJO类型 场景
BIGINT INTEGER BIGINT INT8 java.lang.Long 主键
DATE DATE DATETIME TIMESTAMP(0) java.util.Date 日期
DATETIME DATE DATETIME TIMESTAMP(0) java.util.Date 日期时间
DECIMAL NUMBER NUMERIC NUMERIC java.lang.Double 小数
INT INTEGER INT INT4 java.lang.Integer 整数
LONGBLOB BLOB IMAGE BYTEA java.lang.String 二进制对象
LONGTEXT CLOB NTEXT TEXT java.lang.String 大文本
SMALLINT NUMBER(4) SMALLINT INT2 java.lang.Integer 数字枚举
VARCHAR VARCHAR2 NVARCHAR VARCHAR java.lang.String 文本

# 2-2、新客户:使用Xinchuang下的初始化脚本

如果是新客户,则直接拿到产品的初始化脚本导入到OceanBase for Oracle数据库中:

  • 首先下载信创部署包:致远商务公布的安装程序下载地址-对应版本-程序-2.*_XinChuang.zip

  • 解压Xinchuang.zip,找到数据库脚本存放目录:/deploytools/file/sql/init/

  • 确定当前客户的产品线和版本:A8N-1对应A8-N企业版、A8N-2对应A8-N集团版、G6N-1对应G6-N单组织、G6N-2对应G6-N多组织

  • 然后根据产品信创版本,找到对应版本的Oracle初始化脚本文件,如信创集团版就是A8N-2_ALL_IN_ONE_ORACLE.SQL,将初始化脚本文件导入到第三方数据库中。

常见异常: 导入时可能会遇到创建索引报错,如果遇到create desc index not supported的错误提示,就表示OceanBase不支持DESC逆序索引,需要去掉CREATE INDEX语句中的DESC关键字再继续执行。

参考资料:https://developer.aliyun.com/ask/543460

-- 替换前不可执行示例:
CREATE INDEX IDX_BBS_ARTI_STA_ISSTIM ON BBS_ARTICLE (V3X_BBS_BOARD_ID,TOP_SEQUENCE DESC,ISSUE_TIME DESC,STATE);
CREATE INDEX IDX_CTP_AFFAIR_PLIST ON CTP_AFFAIR (PROXY_MEMBER_ID,STATE,COMPLETE_TIME DESC,APP,SUB_APP,IS_DELETE,ID);

-- 替换后可执行示例:
CREATE INDEX IDX_BBS_ARTI_STA_ISSTIM ON BBS_ARTICLE (V3X_BBS_BOARD_ID,TOP_SEQUENCE,ISSUE_TIME,STATE);
CREATE INDEX IDX_CTP_AFFAIR_PLIST ON CTP_AFFAIR (PROXY_MEMBER_ID,STATE,COMPLETE_TIME,APP,SUB_APP,IS_DELETE,ID);

# 3、部署信创中间件

此步由中间件厂商部署,部署后我们需要配置数据库相关信息。

# 4、中间件下配置数据库连接

# 4-1、标准中间件(金蝶、东方通、宝兰德)下配置数据库方法

中间件是金蝶、东方通、宝兰德这些标准产品验证支持的中间件,可以使用信创可视化部署工具进行部署:

  • 通过开放平台在线查阅信创部署手册(如A8-N V9.0信创部署手册 (opens new window)),或下载离线版手册(致远商务公布的安装程序下载地址-对应版本-文档-安装维护手册)

  • 阅读信创部署手册,了解信创部署工具deploytools的结构和使用方法,以及部署之后数据库相关配置事宜

1)信创工具自动化部署

由于前面步骤已经初始化了数据库,故本次使用信创部署工具不要再做数据库操作,数据库选择“不初始化数据库”(V9.0之前的工具选“其它”),我们仅做中间件的自动化配置部署即可:

1720713199291.png

使用无图形页面的部署工具也可以部署,同样选择“不初始化数据库”(V9.0之前的工具选“其它”),仅做中间件的自动化配置部署即可:

1721190240651.png

在V9.0以前版本,无图形页面部署结束会有“未找到对应数据库版本驱动JAR,替换失败”的错误提示,此错误可忽略--不选择数据库部署提示这个错误,是正常的。因为这个原因导致的“安装失败”的错误提示也可以忽略。

1721190294094.png

以上完成后,需要接着做一些人工部署操作:

2)拷贝驱动jar:将数据库驱动jar(本次拿到的是oceanbase-client-2.4.9.jar)拷贝到中间件的lib下

  • 东方通中间件一般是TongWeb/lib/目录下,随后重启东方通服务

  • 金蝶中间件是拷贝到对应版本中间件lib下(如AASV9.0/lib/),建议重启中间件

  • 宝兰德是拷贝到实例的lib目录下(如:/home/BES-CLUSTER-9.5.2/node/seeyon_node1/instances/seeyon_a/lib/),建议重启中间件

3)中间件下调整JVM参数,增加或调整-Djdbcproxydriver.driverclass的参数配置:

-Djdbcproxydriver.driverclass=com.oceanbase.jdbc.Driver

1721212168286.jpg

4)中间件下配置数据源连接

  • 名称:jdbc/ctpDataSource
  • 数据库驱动类名:使用致远的com.seeyon.ctp.monitor.perf.jdbcmonitor.proxyobj.JMProxyDriver,如果不生效再使用OceanBase自己的com.oceanbase.jdbc.Driver
  • 数据库连接URL:格式为jdbc:oceanbase://host:port/?useCompatibleMetadata=true&compatibleOjdbcVersion=8,特别注意:useCompatibleMetadata=true&compatibleOjdbcVersion=8 数据库参数是必须的,否则启动不了。
  • 数据库驱动jar包地址:设置为前面第2步中间件lib下的jar
  • 数据库帐号密码:按厂商提供的录入,格式为用户名@租户名#集群名

注:注:这里驱动类名设置为com.seeyon.ctp.monitor.perf.jdbcmonitor.proxyobj.JMProxyDriver表示使用致远的驱动代理,使用这个代理可以针对某些数据库做一些个性化转化,更加稳定

1721194398049.png

# 4-2、定制开发以适配OceanBase数据库

参考第三方数据库解决方案手册判断OceanBase Oracle模式涉及定制开发,https://open.seeyoncloud.com/v5devCTP/40/1113/1114.html

OceanBase数据库URL:jdbc:oceanbase://xxx
OceanBase数据库驱动类:com.oceanbase.jdbc.Driver

1、(V9.0以上版本已迁移到ctp-panda工程)修改ctp-giant-panda\src\main\java\com\seeyon\ctp\giant\panda\database\url\ValidateContext.java文件,增加oceanbase的注册:

1721196857668.png

2、(V9.0以上版本已迁移到ctp-panda工程)修改ctp-giant-panda\src\main\java\com\seeyon\ctp\giant\panda\database\url\jdbcParamsBlackWhiteList.properties,增加oceanbase的注册:

1721197111657.png

3、(V9.0以上版本已迁移到ctp-panda工程)修改ctp-giant-panda\src\main\java\com\seeyon\ctp\giant\panda\database\url\vendorDriverUrlWhiteList.properties,增加oceanbase的注册:

1721196988999.png

4、修改ctp-jdbcproxydriver\src\main\java\com\seeyon\ctp\monitor\perf\jdbcmonitor\proxyobj\ProxyDriverList.properties,增加oceanbase的注册:

1721197145612.png

以上完成后,做好Java代码(ValidateContext.java)的编译,将修改的文件以补丁的形式放入标准产品对应jar里:ctp-giant-panda工程修改的文件经过编译后放入seeyon-ctp-giant-panda.jar对应路径下;ctp-jdbcproxydriver工程修改的文件放入seeyon-ctp-jdbcproxydriver.jar对应路径下。

jar文件要么存放于seeyon/WEB-INF/lib下,要么就是放置在中间件/lib目录下。

# 4-3、部署seeyon并启动验证

以上完成后,数据库相关连接配置就告一段落。剩下是按照信创部署手册,在中间件下做Seeyon应用包的部署、发布、启动,功能验证。

# 扩展说明:OceanBase数据库调优

如果要做压测和生产上线前,务必让三方数据库厂商做好数据库的参数配置调优。

# 常见问题

问题:低版本用无图形化页面部署,数据库选择其它,会提示“未找到对应数据库版本驱动JAR,替换失败”

解决方案:数据库选择“其它”,则此提示可以忽略,“安装失败”的提示也可以忽略,这是成功的。V9.0版本已经修正了工具,不再提示错误。

1721117683014.jpg

问题:导入A8-N Oracle初始化SQL失败,提示create desc index not supported

解决方案:去掉CREATE INDEX语句中的DESC关键字再继续执行,OceanBase不支持DESC逆序索引。

1721198120972.jpg

问题:中间件下配置数据库连接后,一直提示连接被拒绝

解决方案:

1、用户名尝试用三段式配置 (opens new window)用户名@租户名#集群名(出问题的项目是通过此方案解决的) 2、驱动类名不要用中间件默认填入的,用前面手册部分的类名 3、以上都不行的时候,联系OceanBase厂商看看

1721198661868.png

1721198869593.png

1721198766518.png

问题:部署启动不成功,日志显示IAJdbcUtil.init空指针异常

解决方案:【启动问题】使用未标准适配数据库启动OA失败,日志显示IAJdbcUtil.init空指针异常 https://open.seeyoncloud.com/#/faq/faq/v1/share?url=Z2JySmU+MjQ1MQ==

问题:保存CAP4报错,日志显示 Unimplemented method: getSchema()

解决方案:数据库连接URL后面加上参数compatibleOjdbcVersion=8解决

Connection#getSchema()是JDBC4.2的规范,该规范适配JDK8及以上,如果出现Unimplemented method: getSchema()那就是驱动Jar的实现未遵循JDBC4.2规范,OceanBase是通过连接URL设置jdbcVersion=8来让驱动强制走JDK8 API解决的问题。

1721201240793.jpg

1721201705692.png

创建人:het
修改人:het