# 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;]
内部版本查询结果:
# 数据库信息
数据库连接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之前的工具选“其它”),我们仅做中间件的自动化配置部署即可:
使用无图形页面的部署工具也可以部署,同样选择“不初始化数据库”(V9.0之前的工具选“其它”),仅做中间件的自动化配置部署即可:
在V9.0以前版本,无图形页面部署结束会有“未找到对应数据库版本驱动JAR,替换失败”的错误提示,此错误可忽略--不选择数据库部署提示这个错误,是正常的。因为这个原因导致的“安装失败”的错误提示也可以忽略。
以上完成后,需要接着做一些人工部署操作:
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
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
表示使用致远的驱动代理,使用这个代理可以针对某些数据库做一些个性化转化,更加稳定
# 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的注册:
2、(V9.0以上版本已迁移到ctp-panda工程)修改ctp-giant-panda\src\main\java\com\seeyon\ctp\giant\panda\database\url\jdbcParamsBlackWhiteList.properties,增加oceanbase的注册:
3、(V9.0以上版本已迁移到ctp-panda工程)修改ctp-giant-panda\src\main\java\com\seeyon\ctp\giant\panda\database\url\vendorDriverUrlWhiteList.properties,增加oceanbase的注册:
4、修改ctp-jdbcproxydriver\src\main\java\com\seeyon\ctp\monitor\perf\jdbcmonitor\proxyobj\ProxyDriverList.properties,增加oceanbase的注册:
以上完成后,做好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版本已经修正了工具,不再提示错误。
问题:导入A8-N Oracle初始化SQL失败,提示create desc index not supported
解决方案:去掉CREATE INDEX语句中的DESC关键字再继续执行,OceanBase不支持DESC逆序索引。
问题:中间件下配置数据库连接后,一直提示连接被拒绝
解决方案:
1、用户名尝试用三段式配置 (opens new window)用户名@租户名#集群名
(出问题的项目是通过此方案解决的)
2、驱动类名不要用中间件默认填入的,用前面手册部分的类名
3、以上都不行的时候,联系OceanBase厂商看看
问题:部署启动不成功,日志显示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解决的问题。