ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

信创改造软件设计实战:从数据库迁移到适配测试的全面指南

信创改造软件设计实战:从数据库迁移到适配测试的全面指南 做了几年信创项目落地我最深的感受是国产化改造真正的难点从来不在替换这个动作本身而在于替换之后整个系统的行为是否依旧一致、性能是否扛得住、外设是否还认账、用户是否还玩得转。很多团队第一版方案做得漂漂亮亮结果到了现场一跑打印机不工作、浏览器插件加载不了、数据库存储过程报错光这些问题就能磨掉两三个星期。这篇文章我想从软件设计的角度把信创改造过程中最容易被低估、也最值得你提前铺路的地方梳理一遍。内容包括架构层面的替换规划、达梦/人大金仓数据库中那些让人头疼的语法差异、LoongArch和ARM架构下的编译适配、麒麟和统信终端上的日常操作差异以及信创适配测试和认证的一些实践经验。适合正在做国产化迁移或者刚接手信创适配项目的开发、测试和运维人员参考。1. 先搞清楚信创软件设计到底在改什么1.1 表面上是换组件实际上整个技术栈都在变一说到信创很多人第一反应是把Windows换成麒麟再深一点是把Oracle换成达梦。但真正接触过后你会发现这是个牵一发动全身的事情。操作系统变了之后底层的CPU指令集、系统库、编译链、Java虚拟机、数据库驱动、浏览器内核甚至连字体渲染方式都不一样了。我见过一个典型的案例某个管理系统原本跑在x86服务器加Windows Server加SQL Server的架构上客户端是Windows下的IE浏览器还挂了一堆ActiveX控件调用高拍仪和身份证读卡器。信创改造后服务器端换成了鲲鹏920加银河麒麟数据库换成了达梦客户端换成了国产Linux加国产浏览器。你想想从数据库驱动到浏览器控件再到外设SDK整条链路全都要重来一遍。所以做信创软件设计第一步要做的不是选型而是摸清现状。建议先画一张完整的技术栈地图把基础设施层、数据层、应用层、终端层每一层用到的软件、版本号、协议、依赖关系都列出来。这个摸底工作至少花一到两周时间但它能帮你避免后续大量返工。1.2 从架构层面规划替换顺序别一上来就动数据库我在项目里一直坚持一个原则先易后难、先外后内、先终端后服务端。优先把终端侧的浏览器、办公软件、外设驱动这些问题解决掉因为这些问题用户感知最强而且大多是配置层面的改动风险可控。然后做应用中间件的替换和验证比如把WebLogic替换成东方通TongWeb或宝兰德这个阶段会暴露不少类加载和序列化的问题。最后才是数据库迁移因为数据迁移牵扯到业务连续性、数据一致性、性能调优是整个改造中风险最高的环节。还有一个架构决策要特别说明不是所有系统都适合直接替换有些老系统如果重构代价太高可以考虑先把界面层和后端服务解耦做成前后端分离再用兼容网关对接国产数据库。这种渐进式改造虽然短期内看起来多了一层架构但从长期看维护成本反而低很多。信创设计里最忌讳的就是毕其功于一役恨不得一个月把整个机房都换完结果出了问题都不知道从哪查起。2. 核心组件选型与实际适配要点2.1 CPU和操作系统平台架构差异不是小事情目前信创市场上主流的CPU平台包括龙芯LoongArch、飞腾ARMv8、鲲鹏ARMv8、海光x86和兆芯x86几个方向。很多人以为软件适配主要看操作系统其实CPU架构对编译和运行的影响同样巨大。如果你的软件以Java、Python、Go这类解释执行或半解释执行的语言为主CPU架构的适配相对简单只要JDK、Python解释器能跑起来业务代码基本不用改但要注意第三方原生库。比如有些加密算法库、图像处理库如果只有x86的二进制版本在ARM上就会报cannot execute binary file这种错误必须找到对应的ARM版本自己编译。如果是C/C项目那就得认真处理编译链了。x86下的GCC编译参数不一定适用于ARM和LoongArch比如涉及SSE指令集优化的代码在ARM上要改成NEON指令涉及字节序处理的地方要重新验一遍。LoongArch还要注意编译器版本太老的GCC可能不支持新的指令集扩展建议直接用麒麟或统信软件源里的配套编译链不要自己从网上找版本装。实际选型的时候我建议做个小矩阵把每个CPU平台、OS组合、JDK版本、数据库版本列成一个矩阵先做一轮冒烟验证确认哪些组合能正常跑起来再决定测试资源的投入比例。别一开始就在所有组合上花大力气先把主力组合跑通。2.2 数据库迁移达梦和人大金仓的差异化处理达梦DM8和人大金仓KingbaseESV8是目前信创项目里最常见的两个数据库。它们都深度兼容Oracle或PostgreSQL语法但深度兼容不等于100%兼容实际迁移时坑特别多。以达梦为例它兼容Oracle的很多写法比如ROWNUM、SYSDATE、DECODE这些都能用但细节上有差别。我实际遇到的几个高频问题字符串拼接Oracle用||达梦默认也支持但某些语句里空格和NULL的处理行为有差异。分页查询Oracle用ROWNUM达梦支持ROWNUM也支持LIMIT但如果你写了WHERE ROWNUM 20这种带排序的分页很容易查出错误结果。正确姿势是用派生表先排序再取ROWNUM。自增列Oracle用SEQUENCE达梦支持IDENTITY也支持SEQUENCE但迁移时如果直接导入建表语句要注意默认值和自增属性是否保留。空字符串Oracle里空字符串就是NULL达梦里两者有区别业务逻辑里如果依赖这个特性就要小心。存储过程达梦兼容Oracle的PL/SQL大部分语法但包PACKAGE的兼容性相对弱一些复杂的包要逐个函数做验证。人大金仓对PostgreSQL的兼容度更高但如果在老项目里用到了PostgreSQL特有的大对象类型、窗口函数、JSONB操作也要逐项检查版本对应关系。金仓的版本分支比较多不同版本的兼容策略不完全一样建议先找原厂技术支持确认你手里的版本对应的兼容基线。迁移之前一定要做一次静态SQL审查把代码里的SQL语句全部抽出来识别出不兼容的写法。这个工作可以用工具辅助比如达梦自带的迁移工具会给出错误报告但不要全信工具它只能发现一部分问题。最关键的是做一次全量回归测试让业务方把核心业务流程在生产数据副本上完整跑一遍。2.3 中间件和应用服务器的替换WebLogic、WebSphere这些闭源中间件替换成国内产品时最容易出问题的是类加载机制。WebLogic的类加载是先父后子还是先子后父可以配置东方通TongWeb和宝兰德也有类似的选项但默认行为可能不一样。部署上去之后如果发现某些第三方库的类冲突优先考虑调整部署包的lib结构而不是去改中间件的全局配置。另一个高频问题是JNDI数据源配置。原来在WebLogic里配置的数据源迁移到国产中间件后JNDI名称、连接池参数、JDBC驱动类的写法都要重新核对。特别是达梦的JDBC驱动不同的驱动版本支持的连接串写法有差异用错版本会出现连接超时或字符集乱码的问题。还有个细节很多人忽略序列化兼容。如果系统里用到了Java原生的序列化机制比如Session集群同步、MQ消息体、分布式缓存Key等迁移中间件和JDK版本之后序列化IDserialVersionUID不匹配会导致反序列化直接报错。建议在所有实体类上显式声明serialVersionUID不要让它自动生成。3. 实操代码改造与迁移过程全记录3.1 编译环境与工具链的适配在optimization平台鲲鹏上编译Java项目JDK建议直接使用毕昇JDK或者鲲鹏社区提供的ARM版本不要用x86的JDK通过某种兼容层硬跑。系统安装完麒麟之后软件源里自带的OpenJDK版本通常就能满足大多数项目直接apt install openjdk-8-jdk或者yum install java-1.8.0-openjdk-devel不需要额外折腾。如果是C/C项目交叉编译是另一个话题。你可以在x86的开发机上做交叉编译把编译目标设为aarch64或loongarch64然后用一个干净的虚拟机环境验证。但说实话交叉编译的问题排查成本挺高如果测试资源允许直接在麒麟物理机或虚拟机上用软件源里的GCC编译反而更省事。编译时建议打开-Wall很多架构相关的隐性问题在编译阶段就能暴露出来。Go语言在这方面省心不少它是静态编译只要你把GOOS设成linuxGOARCH设成arm64或loong64交叉编译很顺手。但要注意CGO不能启用一旦用了CGO程序就依赖目标平台上的C库处理起来又回到C/C那套逻辑去了。另外Go版本要尽量新一点老版本对LoongArch的支持不完整。Python项目主要看第三方包的wheel有没有对应架构的版本。很多常用包比如lxml、numpy官方只发布x86和部分ARM的wheelLoongArch需要自己用源码编译这时需要确保源码编译依赖gcc、python3-dev、libffi-dev等都装齐全。建议项目里对依赖做一次架构矩阵扫描提前标记出哪些包需要源码编译不要拖到生产环境才发现装不上。3.2 数据库迁移改造的完整流程数据库迁移我拆成了四个阶段每个阶段有明确的交付物第一阶段是结构迁移。用数据库自带的迁移工具把表结构、索引、约束、序列、视图、存储过程都迁过去。这个阶段要注意字段类型的映射比如Oracle的NUMBER(10)到达梦里映射成什么VARCHAR2到VARCHAR是否丢失长度语义CLOB和BLOB的迁移是否完整。第二阶段是数据迁移。大表建议分批迁移比如按主键范围每次迁移50万条避免一次性加载导致内存溢出。迁移过程中记录每一批的耗时如果某张表的迁移耗时远超预期优先检查是否有索引缺失或字符集转换的开销。第三阶段是代码适配。把应用代码里的SQL语句、ORM映射、存储过程调用全部审查一遍。如果项目用了MyBatis/JPA重点看动态SQL——动态SQL在运行期拼出来的语句静态审查是发现不了的必须通过回归测试覆盖。如果项目用了存储过程建议把存储过程逻辑尽量迁移到应用层实现虽然工作量大了点但后续维护和跨数据库移植会容易很多。第四阶段是性能压测。迁移完成后要跑一遍业务压测重点关注三个SQL相关的指标慢SQL数量、数据库连接池活跃连接数、事务平均响应时间。达梦默认参数和Oracle差异不小比如缓冲池大小、日志刷盘策略、锁等待超时时间这些参数不调优的话压测结果往往很难看。调优的时候优先改应用侧不合理的SQL和事务逻辑数据库参数放在第二位。3.3 数据一致性校验不能省数据迁移完成后最怕的就是看起来迁移了实际对不上。我的做法是写一套自动校验脚本用计数校验和抽样字段校验双管齐下。计数校验就是对比源库和目标库每张表的行数这个最简单也最有效。抽样字段校验是在每张表里随机抽取N条记录把若干个关键字段的MD5值做对比能发现行数一样但内容不对的问题。时间字段的处理尤其要小心。某些数据库的时间精度不同Oracle的DATE精确到秒达梦的TIMESTAMP精确到微秒迁移之后如果出现秒级以下的误差可能影响业务判断。另一个常见陷阱是时区问题如果数据库服务器和应用服务器的时区配置不一致时间字段读出来会有偏差排查起来很隐蔽。4. 终端环境与外设适配细节4.1 麒麟和统信系统下的日常操作差异信创改造做到终端这一层很多用户第一反应是不会用。说实话银河麒麟和统信UOS都是基于Linux的桌面系统操作习惯和Windows差异很大。比如想在终端里查找文件很多用户不知道可以用find /path -name xxx想删个文件不知道rm -rf的威力有多大更别说权限、软链接、环境变量这些概念了。在软件设计层面如果你的应用有桌面客户端要主动适配这些差异。比如路径分隔符不要写死为\配置文件里配置路径时要考虑Linux的绝对路径规则。另外麒麟系统默认的字体渲染和Windows不一样常见的Times New Roman字体在麒麟上可能没有预装界面排版会错位建议在应用里显式指定跨平台字体族优先用Noto Sans CJK或者系统默认的宋体/黑体替代。如果用户需要在信创终端上跑传统Windows应用比较靠谱的方案是虚拟机和Web化两种。虚拟机方案性能损耗大但兼容性最好适合一些非核心但不得不用的旧系统。Web化方案是把Windows应用改造成B/S架构或者用远程应用推送方案把应用界面投射到本地浏览器里。我现在更倾向于远程应用推送因为终端本地不用安装任何Windows环境维护工作量小很多。4.2 浏览器、打印机、U-Key等外设兼容信创终端上最痛的外设问题我排个序U-KeyUSBKey 打印机 高拍仪/扫描仪 身份证读卡器。U-Key之所以排第一是因为很多政务和金融系统的登录、签名、加密都依赖它而U-Key驱动和浏览器控件必须针对国产操作系统单独开发。浏览器方面目前信创终端常用的国产浏览器有奇安信、360、红莲花等它们大多基于Chromium内核对HTML5支持尚可。但如果你原来的系统大量依赖IE的ActiveX控件那就得考虑两条路要么把控件逻辑改造成WebSocket加本地服务模式本地起一个守护进程和浏览器通过WebSocket通信要么干脆把客户端抽出来做成独立的桌面程序。前者工作量适中体验比ActiveX时代好很多后者适合功能复杂、和操作系统交互深的场景。打印机的问题主要是驱动。很多打印机厂商只提供Windows驱动Linux下的驱动要么没有要么功能不全。解决方案有两个方向一是挑选信创名录里明确支持的打印机型号二是通过CUPS打印系统做驱动适配。如果业务系统里需要调用打印API建议在软件设计阶段就抽象出一个打印服务层后端通过标准接口下发打印任务终端上的打印代理负责和不同品牌的打印驱动对接这样换设备时只改代理端不用动业务系统。4.3 虚拟化和桌面云场景的特殊处理信创项目里经常会上一套桌面云或虚拟化方案把终端桌面统一放到服务器端用户通过瘦客户端或远程桌面访问。这种模式的好处是集中管控、好维护但也有代价外设透传和视频流畅度都可能打折扣。U-Key在外设透传时经常出现插上去没反应或时通时断的问题。排查思路是先确认虚拟化平台是否支持USB直通再确认客户端侧是否安装了对应的USB重定向驱动。如果实在不行可以考虑把U-Key校验集中到一台物理服务器上做让所有虚拟桌面共享这台服务器上的U-Key设备虽然并发量受限但稳定性会好很多。还有视频播放和高清摄像头预览的流畅度问题。虚拟化环境里图像数据要经过编码、网络传输、解码三个环节延迟不容易降下来。如果业务场景对视频流畅度要求很高建议不要把视频应用跑在虚拟桌面里改成WebRTC或其他直连方式绕过虚拟化链路。5. 信创测试、认证与问题排查5.1 适配测试怎么设计信创适配测试不能简单复制原有的测试用例它要在原有功能测试基础上增加环境相关的测试维度。我的测试矩阵一般包含四部分功能测试、兼容性测试、性能测试、安全性测试。功能测试沿用原有用例集但要重点补充数据库相关用例增删改查、事务回滚、存储过程调用和文件IO相关用例路径分隔符、文件名编码、权限控制。兼容性测试要覆盖不同的CPU/OS/浏览器/数据库组合这个矩阵很大不可能全量组合测试建议先分析业务的实际部署范围选定主力组合做全量测试其他组合做冒烟测试。性能测试不能只关注业务响应时间还要关注数据库连接池、内存占用、磁盘IO这几个容易出问题的点。还有一点信创环境的指纹特征和原来不一样比如用户代理字符串、浏览器插件支持情况、字体列表都不同这些会影响页面的javascript判断逻辑。测试时要把页面在各浏览器下的实际渲染结果都截图留档别只用一个浏览器测完就交差。5.2 典型问题与排查方法整理几个我在现场遇到的高频问题给你一个排查思路的参考第一类应用启动失败报错信息是Unable to load native library。这多半是C/C原生库或JNI库找不到对应架构版本。先去确认应用的运行平台是x86还是ARM还是LoongArch再确认库文件是否匹配。如果是通过Java的System.loadLibrary加载的还要检查java.library.path是否包含了库文件的路径。第二类数据库连接池频繁报错错误码类似Cannot create PoolableConnectionFactory。先检查达梦或金仓的JDBC驱动版本是否匹配数据库版本然后检查连接串里的IP、端口、数据库名是否正确。还有一个隐蔽点达梦新版驱动默认的网络超时时间可能很短如果应用和数据库之间有防火墙或负载均衡经常出现闲置连接被切断的情况适当调整连接池的验证查询配置能缓解。第三类页面字体显示为方块或乱码。这个问题最常见的原因就是系统缺少中文字体。安装fonts-noto-cjk或者其他中文字体包就能解决。如果应用里有指定非中文字体也要确认字体文件是不是随应用一起打包了。第四类用户反馈没有命令行权限或者很多Linux命令不识别。这不是系统故障是用户习惯了Windows的命令方式。建议在项目启动时做一轮终端使用培训内容和快捷键把高频的命令操作整理成速查表。有些系统管理员习惯用的命令在麒麟上要加sudo前缀不同Linux发行版的包管理器也不一样——银河麒麟V10基于Ubuntu的用apt部分基于CentOS的版本用yum别搞混。5.3 适配认证材料准备心得信创项目通常需要出具适配认证证书这个证书一方面是项目验收的硬性要求另一方面也是后续项目投标的资质证明。适配认证的流程一般是提交申请、原厂或第三方检测机构做兼容性测试、出具测试报告、颁发证书。准备材料时最忌讳的是临时抱佛脚。我建议项目从一开始就建立一份适配认证档案把每一步做过的事情都留痕。测试报告里需要体现测试环境、测试工具、测试范围、测试结果、问题处理记录这些都要有据可查。尤其是问题处理记录哪怕是一个很小的bug也要记录清楚复现步骤、根因分析、修复方案、验证结论。这些内容一方面是给认证机构看的另一方面也是项目经验的沉淀。还有一点如果目标系统涉及和多家厂商做互认比如操作系统厂商、芯片厂商、数据库厂商、中间件厂商要提前确认各自的测试标准是否一致避免同一项测试反复做。有些厂商在对方已经出具测试结论的基础上可以免测部分项目这个需要商务和原厂沟通确认。6. 长期主义视角下的软件设计建议信创改造不是一次性项目它更像是整个技术体系的一次换血。项目上线之后后面还有版本升级、补丁管理、新增功能、二次适配等一系列工作。所以软件设计阶段就要为长期维护做好准备。首先是模块化设计。信创环境出现新问题比如某个组件升级后不兼容是常态如果你把系统做成高内聚低耦合的模块化架构遇到问题时就可以只改局部模块不需要整个系统回归。其次是配置化。环境相关的参数数据库连接、路径、端口、线程池大小尽量放到配置中心或配置文件里不要硬编码在代码中。最后是自动化。持续集成和持续部署在信创环境里同样适用把编译、部署、冒烟测试都自动化之后换一台新的服务器、装一个全新的操作系统版本验证成本会大幅降低。我个人在实际操作中的体会是信创软件设计最考验的不是技术深度而是对整个技术栈广度的理解。你得同时懂一点CPU架构、懂一点Linux系统、懂一点数据库原理、懂一点浏览器兼容性甚至还要懂一点用户体验和培训技巧。这些东西在教科书上不会集中出现只有在项目现场一遍遍踩坑之后才能沉淀下来。上面这些内容都是我踩过坑之后整理出来的经验希望对正在做或准备做国产化改造的同行有帮助。如果后续在具体环节上有问题欢迎交流。
返回列表