# 海量数据库项目化部署升级手册

北京致远互联软件股份有限公司

2024年12月修订

# 前言

海量数据库标准产品自V11版本开始支持,V11版本可通过标准部署手册部署使用《A8N&G6N信创部署维护手册V11 (opens new window)》。

低版本客户需要参考本手册进行项目化集成(有项目成功上线案例)。

本手册支持版本:V8.2到V10.0SP1,参照本手册集成配置,暂不涉及定制开发代码适配。

项目化支持,意味着可能存在项目化适配成本,并且项目化过程中产生的BUG、以及后续OA版本升级需要额外项目化成本解决

数据库基础信息:

数据库url格式=jdbc:postgresql://127.0.0.1:5432/zyoa?characterEncoding=utf8&batchMode=false
JDBC驱动名driverClassName=org.postgresql.Driver
JDBC连接获取数据库名DatabaseMetaData.getDatabaseProductName()=PostgreSQL
驱动jar:使用海量数据库安装程序下的JDBC驱动jar

根据海量数据库特性,产品的初始化SQL和代码逻辑会采用PostgreSQL标准。

Vastbase G100是海量数据基于开源openGauss内核开发的企业级关系型数据库

# 海量数据库注意事项

# 海量集成-项目组注意事项

如客户使用海量数据库,请项目组按如下要求配合海量、客户多方完成集成部署:

1、产品不提供海量数据库本身的安装部署、维护、调优、转库详细解决方案,此类方案以数据库厂商专业支持为准。海量数据库部署链接参考:https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/4fa8e614a0874730bd1f49bb9d0dd498

2、新客户使用海量数据库的部署路线:海量厂商准备一个空库,致远侧按对应中间件手册部署协同系统,工具部署时会自动向海量空库写入初始化脚本

3、老客户转海量数据库的部署路线:

  • 第一步,海量厂商准备一个空库,致远侧按对应中间件手册部署协同应用系统,先确保一个初始化环境能部署、启动、登录成功
  • 第二步,老客户原环境升级协同到当前版本,海量侧进行数据库转库,第一步部署的协同应用数据库URL地址指向本步转库后的数据库地址
  • 第三步,迁移老客户原环境的附件、资源文件到信创环境,随后启动、登录、验证功能完整性

4、咨询海量技术了解到postgresql-xxx.jar可以做海量驱动,致远Xinchuang部署工具默认内置postgresql-42.7.5.jar驱动文件,部署时可以将其放置到中间件lib目录,如存在兼容异常可按需更换数据库厂商驱动。

# 海量集成-海量方注意事项

1、产品线选择海量Vastbase G100 V3.0 (Build 8) Release(或选择V2.2.19),通过 select vb_version(); 获取版本信息。

2、转海量库时不要重命名原库的INDEX索引名称,产品是根据索引名称判断索引是否存在。特殊处理点:MySQL或SQLServer转库可能遇到formmain、formson索引重名问题,参考【关联FAQ】 (opens new window)处置即可。

3、V8.2之后协同应用就未使用过存储过程、视图、触发器、函数,转海量库时如涉及这些东西,可能是客户、客开、第三方加的(如LEXMIS_开头的存储过程是致迈插件),标准产品不涉及这些。

4、致远OA对数据库的要求:大小写不敏感(如存在此配置,需勾选)、UTF8字符集、兼容PG标准(不支持其它数据库兼容模式)、单机或主备(不支持读写分离)。

1732875742137.png

5、必须联系海量数据库厂商忽略如下关键字:body、sample、image,这三个关键字在致远产品中使用,如未忽略会导致系统不可用。

通过修改postgresql.conf配置文件中的参数vb_exclude_reserved_words=‘body,sample,image’ ,将关键字屏蔽掉,重启数据库生效

1733311958807.png

6、海量数据库一个帐号支持多模式,必须将OA表数据所在的模式设置在最前面。多模式下协同表未放第一位的问题案例 《协同OA无法启动,日志显示ERROR: relation "ctp_config" does not exist (opens new window)》。

如下图所示假设dbo是OA相关的表数据,必须设置search_path在第一个,详细配置方法:将postgresql.conf中的search_path参数值dbo设置为首位:

1733312116144.png

7、特别注意:海量的日期字段不要用timestamp(0) with time zone,不要带时区,正确类型为 timestamp(0) without timezone!

[timestamp(0) without timezone]字段存储日期内容为"2025-05-27 17:51:00",这个是标准产品认识的格式;而[timestamp(0) with time zone]字段存储日期内容为"2025-05-27 17:51:00+08"(日期后面多了一个+08),这个标准产品不认识,会导致进行查询统计时异常

8、转海量库后最常见的问题一是丢失索引,直接表现是系统部分功能卡顿,致远项目组可尝试用环境检查工具扫描缺失的索引,或者取XinChuang部署包中的初始化SQL给海量老师协助,里面有全套索引可做补齐,初始SQL位置:XinChuang\deploytools\file\sql\init\A8N-2\PostgreSQL目录。

9、转海量库后最常见问题二是字段映射错误,直接表现是部分功能正常,部分功能页面各种报错。必须按照如下字段映射关系做转库(非常关键,请务必将图片转给海量):

MYSQL ORACLE SQLSERVER POSTGRESQL和海量 DM KINGBASE(兼容Oracle) OSCAR GBASE HBM文件 POJO类型 场景
BIGINT INTEGER BIGINT INT8 BIGINT INT8(对应bigint) BIGINT BIGINT long java.lang.Long 主键
DATE DATE DATETIME TIMESTAMP(0) TIMESTAMP(0) TIMESTAMP(0)(对应date) TIMESTAMP(0) TIMESTAMP(0) timestamp java.util.Date 日期
DATETIME DATE DATETIME TIMESTAMP(0) TIMESTAMP(0) TIMESTAMP(0)(对应date) TIMESTAMP(0) TIMESTAMP(0) timestamp java.util.Date 日期时间
DECIMAL NUMBER NUMERIC NUMERIC NUMBER NUMERIC (对应decimal) NUMBER NUMBER double java.lang.Double 小数
FLOAT FLOAT FLOAT FLOAT8 FLOAT FLOAT8(对应float) FLOAT FLOAT float java.lang.Float 浮点数
INT INTEGER INT INT4
(Oracle转INT8)
INT
(Oracle转BIGINT)
INT4 (对应int)
(Oracle转INT8)
INTEGER INT integer java.lang.Integer 整数
LONGBLOB BLOB IMAGE BYTEA BLOB BYTEA (对应longblob) BLOB BLOB string java.lang.String 二进制对象
LONGTEXT CLOB NTEXT TEXT CLOB TEXT (对应longtext) CLOB CLOB string java.lang.String 大文本
SMALLINT NUMBER(4) SMALLINT INT2 SMALLINT INT2 (对应smallint) SMALLINT SMALLINT integer java.lang.Integer 数字枚举
TINYINT(OA早期版本使用) NUMBER(4) SMALLINT INT2 SMALLINT INT2(对应smallint) SMALLINT SMALLINT integer java.lang.Integer 数字枚举
VARCHAR VARCHAR2 NVARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR string java.lang.String 文本

10、海量数据库连接URL采用 jdbc:postgresql://数据库IP:5432/数据库名 格式经研发验证可用!

# 部署示例

OA版本:A8-N V9.0SP1

金蝶V10

海量数据库版本:2.2.15.PSU3

通过select version();语句查询此版本采用PostgreSQL 9.2.4内核:

1733221541081.png

关联支持项目:JSFW-2024-00229、PMP-JFZC-2024-4555、JSFW-2024-00669、JSFW-2024-02459

# 部署流程

1、中间件(东方通、金蝶、宝兰德)提前准备,海量数据库提前准备(如果是新客户就准备一个空库,如果是老客户就做好转库)

2、参考信创环境部署手册,准备对应的XinChuang.zip信创部署包,使用信创部署工具将OA相关基础配置写入中间件中,数据库选择“不初始化数据库”,初始化结束后将-N的加密授权注册更新并放置到OA程序base/license目录下。

再次提醒:标准支持的中间件用信创部署工具去部署,减少部署复杂度,降低部署失败概率!!!

3、如果是新客户,由海量厂商安装好数据库并新建一个空库后,执行数据库初始化操作,继续使用上一步的XinChuang.zip部署包。

初始化数据库脚本在XinChuang文件夹下的deploytools\file\sql\init目录中找到对应版本的PostgreSQL(A8N-1是企业版,A8N-2是集团版),如企业版命名为:A8N-1_ALL_IN_ONE_POSTGRESQL.SQL。

将SQL拷贝到海量数据库对应空库下,执行脚本初始化即可。

4、配置数据库JDBC相关信息:

到信创中间件的JVM配置中增加自定义参数:-Djdbcproxydriver.driverclass=org.postgresql.Driver

  • 金蝶V10到管理控制台-配置管理-server-config-JVM配置-JVM选项中添加或修改此参数
  • 东方通到管理控制台界面-启动参数配置-服务器参数中添加或修改此参数,如果在服务器端改jvm,路径是/TongWeb7.0/bin/external.vmoptions
  • 宝兰德到管理控制台-实例管理菜单-点击实例名称,进入配置页面,点击JVM配置

1733396451991.png

到信创中间件管理控制台,新建JDBC配置:

  • 新建JNDI名称必须是jdbc/ctpDataSource
  • 数据库驱动类名com.seeyon.ctp.monitor.perf.jdbcmonitor.proxyobj.JMProxyDriver
  • 数据库连接URL地址以海量厂商提供为准,一般格式为jdbc:postgresql://127.0.xx.xx(数据库ip):5432(端口)/test_oa(数据库名)

1733396400583.png

海量驱动Jar(格式如VastbaseG100_jdbc_2.9p_2023120616.jar)要将其放置到中间件的lib下,不要手动选择驱动jar位置,放置后需要重启一次中间件才生效:

  • 东方通驱动jar放置到TongWeb/lib目录下
  • 金蝶V10驱动jar放置到aas/lib目录下
  • 宝兰德多实例版本驱动jar放置到宝兰德实例lib下

5、最后是参考信创环境部署手册,去部署应用/ROOT、/static、/seeyon、/sportal,部署完成后正常启动测试即可

# 升级流程

本章节针对使用海量数据库的客户升级,提供一个解决方案 升级版本:A8N-2 V9.0SP1 0731 升级到 A8N-2 V9.0SP1 0320 关联支持单:JSFW-2025-01077

自V9.0版本开始,信创工具提供了信创产品线Postgresql数据库升级的能力,由于项目化适配的时候,海量数据库使用pg兼容模式,因此升级的时候,信创工具可以直接选择pg类型数据库升级

升级前请先将数据库驱动放到安装包的 deploytools/lib 目录下,否则可能会出现下列问题

1743567949986.png

查看日志报错找不到驱动

1743567884211.png

升级完成后请检查 upgrade.log(deploytools或deploytools/logs下),确认没有报错后才算升级完成

升级过程中截图:

1743568086291.png

升级完成日志截图:

1743568167879.png

# 常见问题

# 问题一:body、sample关键字失败

数据库的脚本共1073张表,成功导入1069张,还有4张由于存在关键词失败

1.CTP_TEMPLATE             body关键字
2.CTP_TEMPLATE_HISTORY     body关键字
3.DOC_FORUMS               body关键字
4.CTP_FORMULAS             sample关键词

解决方案:数据库方把对应字段从关键字中去掉处理。通过修改postgresql.conf配置文件中的参数vb_exclude_reserved_words=‘body,sample,image’ ,将关键字屏蔽掉,重启数据库生效。

# 问题二:image关键导致登录报错:null

1716774634395.png

1716774645095.png

解决方案:数据库方把image关键字做屏蔽处理。通过修改postgresql.conf配置文件中的参数vb_exclude_reserved_words=‘body,sample,image’ ,将关键字屏蔽掉,重启数据库生效。

# 问题三:数据库默认配置大小写敏感

常见异常:relation "JK_JOB_DETAILS" does not exist on xxx,这个是数据库大小写敏感后导致的异常。

当大小写敏感时,若sql中字段大小写与数据库中不对应,会出现对象找不到的异常,可以通过大小写敏感设置规避该问题。

  • 大小写敏感设置:

1748590578813.png

1748590610988.png

  • 报错截图:

1727169026961.png

# 问题四:保存表单提示saveTableIndex Error: ERROR: relation "idx_formmain_5041_sort" already exists

1733312244816.png

问题原因是:CAP4在保存表单时会判断当前库、表是否存在索引,如果不存在就会创建。当前程序判断出索引不存在,就去创建,但是创建时数据库由告知存在,所以异常了。

问题根源是:程序通过JDBC42标准,通过meatdata获取表索引时,需要传入默认的schema模式名,从海量数据库获取的schema是public,但是OA数据存储在schema名为dbo中,所以找不到索引。

解决方法是:数据库厂商修改,将dbo设置为首位,OA程序就能获取到了。

1733312116144.png

1733313554263.png

# 问题五:转海量数据库后启动报错:ERROR relation "org_unit" does not exist on node1

1733312544683.png

同问题三,确保数据库大小写不敏感。如大小写敏感,导入数据库是ORG_UNIT大写,查询使用org_unit小写就会提示找不到。

# 问题六:绩效管理模块-在线人数分析查询报错

1745222168644.png

查看报错的logon_log表,发现logout_time字段类型是datetime with timezone,就会在日期后面带上+08这种标识,而反观logon_time类型与之不同则无问题。

建议:最好都用datetime without timezone不带时区,标准PG就没这种时区概念,就不带时区。

1745222237095.png

1745222222320.jpg

# 问题七:Vastbase G100 无法写入问题

JSFW-2025-02987

问题现象:用户报障数据库执行 SQL 一直处于未完成状态。经排查可以进行大部分查询,写入操作 hang 住无法完成

  • 硬件信息: 海光 x86
  • 操作系统信息: UOS 1070
  • 部署架构: 单机
  • 数据库信息: Vastbase G100 2.2.15 psu8

原因:统信 UOS 的已知内核 BUG,此 BUG 导致可能无法唤醒已添加到等待队列里的进程

解决方式:升级系统内核版本

1753077035290.png

# 问题八:org.postgresql.util.PGobject cannot be cast to java.lang.String

项目上从其它库迁移到海量数据库后,启动登录报错,查看日志存在异常 : ClassCastException: org.postgresql.util.PGobject cannot be cast to java.lang.String

原因:转库后有字段类型在海量数据库下不兼容导致报错。比如ctp_config表的config_item、config_value等字段类型是错误的nvarchar2(这个在海量/Postgresql数据库下不适配),将其转换成varchar字段类型则问题消除。

解决方法:重新转库,严格按照本手册前面的 [转库映射规则关系表] 进行字段映射和迁移,上面有详细的源库和目标库字段类型转换关系。

扩展:查询有多少张表字段存问题,参考如下示例:

SELECT 
    table_name,  
    column_name, 
    data_type,   
    data_length, 
    char_length
FROM 
    user_tab_columns
WHERE 
    data_type = 'NVARCHAR2'
ORDER BY 
    table_name, column_id;
16:59:25.755,,[Thread-82],[ERROR],SystemEnvironment: - org.postgresql.util.PGobject cannot be cast to java.lang.String [code : 1381307531]
java.lang.ClassCastException: org.postgresql.util.PGobject cannot be cast to java.lang.String
	at com.seeyon.ctp.common.SystemEnvironment.getDisabledPlugins(SystemEnvironment.java:1254) ~[seeyon-ctp-core.jar:?]
	at com.seeyon.ctp.common.SystemEnvironment.hasPlugin(SystemEnvironment.java:688) ~[seeyon-ctp-core.jar:?]
	at com.seeyon.ctp.util.TimeZoneUtil.isEnable(TimeZoneUtil.java:46) ~[seeyon-ctp-core.jar:?]

1777023425439.png

1777023200301.png

编撰人:zhengkejie、het、wangyxyf、shenlq、zhangpan