简介:保利威网站直播系统、APP直播系统、短视频系统国产化改造中,数据库改造经验总结。
2019年,我国信息和网络安全领域逐步启动“安全可靠工程”,该工程展示了我国在关键系统、应用以及软硬件产品研发集成方面的能力,能够初步实现对国外信息技术产品的全方位替代。
当时,国家提出了“2+8”安全可控体系, “2”指在党政机关围绕办公及国家重要信息系统推进国产化替代,随后逐步在金融、电力、电信、石油、交通、教育、医疗、航空航天等八大国计民生行业实现安全可靠、自主可控,以保障国家信息安全。
2020年,央行成立金融信创生态实验室,首批金融信创解决方案出现,被视为信创产业应用实践元年。
信创通过生态上下游产品兼容适配,实现全链条安全可控,强调国产产品技术全栈支持,目的是从基础硬件到信息安全等各方面,通过自主研发和推广自主化、国产化技术标准,达到自主可控,解决核心技术 “卡脖子” 问题。
信创的宗旨是实现信息技术自主可控,规避外部技术制裁和风险,核心是建立自主可控的信息技术底层架构和标准,推动全产业链国产化替代。
国产化是用国内自主研发的技术和标准替代进口产品和技术的过程,主要涉及基础硬件、基础软件、应用软件、信息安全四大板块。例如在制造业,机器换人可加速国产化替代进程,企业需集中资源突破关键技术,实现核心设备自主可控,以巩固市场和竞争优势;在核电厂领域,DCS元器件国产化也是核电自立战略的重要部分,已开展相关研究并提出解决方案。
随着视频直播技术的普遍应用,建立企业直播系统成为常态,银行等央国企内部都需要一套直播/录播培训系统,要求是国内自主研发的技术。
保利威为许多大型企业提供了满足信创要求的直播系统,在此过程中积攒了一些经验,本次分享直播系统mysql项目爆改达梦数据库的过程和注意事项。
原有项目是基于mysql架构,跟客户沟通了数据库选型,最后选择了达梦数据库,原因是它是国产数据库第一股且在中国信息安全测评中心排名第一,而且有丰富的数据迁移方式和比较好的兼容性,适合将旧项目从mysql迁移过渡到梦数据库中。
我们先是在达梦数据库官网找到DM8相关产品并下载相关的数据库安装包,然后借助windows电脑安装达梦数据库的迁移工具进行数据迁移,原项目的数据库表迁移直接按照迁移工具新建迁移工程进行迁移即可。
【大小写敏感设置】
如果想要迁移过来表对象仍然保持小写,需要勾选“保持对象名大小写”,后期查询时,需要使用双引号查询;
如果想要迁移过来表对象仍然保持大写,不需要勾选“保持对象名大小写”,后期查询时,不需要使用双引号查询,因为会自动转换成大写查询。
【大小写不敏感】
如果想要迁移过来表对象仍然保持小写,需要勾选“保持对象名大小写”,后期查询时,不需要使用双引号查询;
如果想要迁移过来表对象仍然保持大写,不需要勾选“保持对象名大小写”,后期查询时,不需要使用双引号查询,因为会自动转换成大写查询。
【查询大小写设置】
SELECT CASE_SENSITIVE(); /select PARA_VALUE from v$dm_ini where “V$DM_INI”.PARA_NAME like’%CASE_SENSITIVE’;结果为 1 是大小写敏感,结果为 0 是不敏感。
针对数据库大小写的问题,有两种解决方式:
即不指定大小写,这样通过sql查询的时候只要表名或字段不使用双引号进行包裹书写,大小写都可以兼容
1.replace替换为merge语句(也可以改为批量删除再批量insert)
— mysql:
<insert id="batchInsertOrUpdate" parameterType="java.util.List">
replace into permission (role_id, permission_id, created_time)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.roleId,jdbcType=INTEGER}, #{item.permissionId,jdbcType=INTEGER}, now())
</foreach>
</insert>
-- 达梦:
<insert id="batchInsertOrUpdate" parameterType="java.util.List">
MERGE INTO permission rp
USING (
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT #{item.roleId} AS role_id, #{item.permissionId} AS permission_id FROM dual
</foreach>
) s
ON (rp.role_id = s.role_id AND rp.permission_id = s.permission_id)
WHEN MATCHED THEN
UPDATE SET rp.created_time = now()
WHEN NOT MATCHED THEN
INSERT (role_id, permission_id, created_time)
VALUES (s.role_id, s.permission_id, now());
</insert>
参数如截图;也可改 INSERT IGNORE INTO 为 INSERT INTO2、达梦支持IGNORE字段,但是需要改造,参数截图;也可改 INSERT IGNORE INTO 为 INSERT INTO
在mysql数据表结构迁移到达梦时,AUTO_INCREMENT会被替换为IDENTITY,从而导致不能使用SELECT LAST_INSERT_ID()
所以,如果要使用SELECT LAST_INSERT_ID(),在数据表结构迁移的时候,选择不要将AUTO_INCREMENT替换为IDENTITY即可
— mysql:
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
-- 达梦:
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT @@IDENTITY
</selectKey>
user是比较特殊的关键字,如果将user作为字段名,不管是否加上双引号,最终都会返回连接达梦数据库的用户名。所以user不能作为字段名,需要替换为其它字段名称。
关键字可参考:https://eco.dameng.com/document/dm/zh-cn/pm/sql-appendix
【方式1:增加达梦数据库配置并重启数据库】
【方式2:group by需将所有的select 字段(排查聚合函数后)列入】
— mysql:
<select id="list" parameterType="map" resultType="net.polyv.nezha.dao.domain.WebappRoleDO">
SELECT wr.*, GROUP_CONCAT(wp.name SEPARATOR ‘,’) as pName
FROM a as wr
LEFT JOIN b as wrp on wr.id = wrp.r_id
LEFT JOIN c as wp on wrp.p_id = wp.id
<where>
<if test="name != null and name != ''">
AND wr.name LIKE concat(‘%’,#{name},’%’)
</if>
</where>
GROUP BY wr.id
ORDER BY wr.id DESC
</select>
</mapper>
-- 达梦:
<select id="list" parameterType="map" resultType="net.polyv.nezha.dao.domain.WebappRoleDO">
SELECT wr.id, wr.name, wr.description, wr.created_time, wr.updated_time, wm_concat(wp.name) as pName
FROM a as wr
LEFT JOIN b as wrp on wr.id = wrp.r_id
LEFT JOIN c as wp on wrp.p_id = wp.id
<where>
<if test="name != null and name != ''">
AND wr.name LIKE concat('%',#{name},'%')
</if>
</where>
GROUP BY wr.id, wr.name, wr.description, wr.created_time, wr.updated_time
ORDER BY wr.id DESC
</select>
</mapper>
将GROUP_CONCAT(wp.name SEPARATOR ‘,’) 替换为 wm_concat(wp.name),这里的SEPARATOR如果不是默认的逗号,需要使用replace把逗号换成自己需要的。
【 UNICODE_FALG】
此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。需要注意的是,数据库一旦初始化完成,字符集就将无法修改。我们可以使用select unicode来查询当前数据库的字符集种类,0代表gb18030,1代表UTF-8。
【 LENGTH_IN_CHAR】
此参数决定了,数据库中的VARCHAR类型对象的长度是否以字符为单位。取值为1则设置为以字符为单位,将存储长度值按照理论字符长度进行放大。取值为0则所有 VARCHAR 类型对象的长度以字节为单位。
UNICODE_FLAG=0,LENGTH_IN_CHAR=0(即字符集为gb18030,varchar长度以字节为单位):gb18030下一个汉字或者全角字符一般需要占用两个字节。所以varchar(3)型可以插入一个汉字加上一个半角字符,但是无法插入两个汉字。
UNICODE_FLAG=1,LENGTH_IN_CHAR=0(字符集为utf-8,varchar长度以字节为单位):Utf-8的情况下,一个汉字一般需要占据三个字节,所以varchar(3)只能插入一个汉字。
UNICODE_FLAG=0,LENGTH_IN_CHAR=1(字符集为gb18030,varchar长度以字符为单位):在length_in_char=1的情况下,varchar的实际可存储字节数会按一定比例放大。所以在使用gb18030的时候,varchar(3)实际可以存储3个汉字,也就是3*2=6个字节的数据。
UNICODE_FLAG=1,LENGTH_IN_CHAR=1(字符集为utf-8,varchar长度以字符为单位):一个varchar(3)的结构可以存放的数据为3*4=12个字节。然而事实上UTF-8中的一个汉字一般只用占用3个字节,所以这里我们可以插入12/3=4个汉字。
字段为text类型且值比较大,select该字段时,该字段的值不会一次性返回,需要在dm连接串加上参数lobMode=1从而保证该字段一次性返回。
补充一下目前保利威直播系统信创方面的兼容证书,正在做国产化项目改造或者寻找替代方案的可以参考一下申请:
1.达梦数据库管理系统V8兼容
2.飞腾FT-2000+/64、飞腾腾云S2500处理器兼容
3.华为鲲鹏 Kunpeng920兼容
4.长城擎天DF7系列、擎天EF8系列兼容
5.麒麟高级服务器操作系统飞腾版V10、鲲鹏版V10、兆芯版V10、海光版V10、AMD64版V10兼容
6.麒麟桌面操作系统飞腾版V10、鲲鹏版V10、龙芯版V10、兆芯版V10、海光版V10、AMD64版V10兼容
7.麒麟桌面操作系统龙芯版V10(loongArch 3A5000)、申威版V10、海思麒麟版V10兼容
8.统信服务器操作系统V20、兆芯KH-3000、兆芯KH20000、兆芯ZX-C+系列处理器兼容
9.统信服务器操作系统V20、海光5000、海光7000系列处理器兼容9.统信服务器操作系统V20、海光5000、海光7000系列处理器兼容
以上是我们做直播系统信创改造时数据库部分的经验总结,希望能帮到大家,有相关疑问留言/私信我(wechat:lei_768768)