一、信創國產化背景
1.安可
2019年,我國信息和網絡安全領域逐步啟動“安全可靠工程”,該工程展示了我國在關鍵系統、應用以及軟硬件產品研發集成方面的能力,能夠初步實現對國外信息技術產品的全方位替代。
當時,國家提出了“2+8”安全可控體系, “2”指在黨政機關圍繞辦公及國家重要信息系統推進國產化替代,隨后逐步在金融、電力、電信、石油、交通、教育、醫療、航空航天等八大國計民生行業實現安全可靠、自主可控,以保障國家信息安全。
2.信創
2020年,央行成立金融信創生態實驗室,首批金融信創解決方案出現,被視為信創產業應用實踐元年。
信創通過生態上下游產品兼容適配,實現全鏈條安全可控,強調國產產品技術全棧支持,目的是從基礎硬件到信息安全等各方面,通過自主研發和推廣自主化、國產化技術標準,達到自主可控,解決核心技術 “卡脖子” 問題。
信創的宗旨是實現信息技術自主可控,規避外部技術制裁和風險,核心是建立自主可控的信息技術底層架構和標準,推動全產業鏈國產化替代。
3.國產化
國產化是用國內自主研發的技術和標準替代進口產品和技術的過程,主要涉及基礎硬件、基礎軟件、應用軟件、信息安全四大板塊。例如在制造業,機器換人可加速國產化替代進程,企業需集中資源突破關鍵技術,實現核心設備自主可控,以鞏固市場和競爭優勢;在核電廠領域,DCS元器件國產化也是核電自立戰略的重要部分,已開展相關研究并提出解決方案。
4.直播系統信創
隨著視頻直播技術的普遍應用,建立企業直播系統成為常態,銀行等央國企內部都需要一套直播/錄播培訓系統,要求是國內自主研發的技術。
保利威為許多大型企業提供了滿足信創要求的直播系統,在此過程中積攢了一些經驗,本次分享直播系統mysql項目爆改達夢數據庫的過程和注意事項。
二、直播系統國產化開發準備
原有項目是基于mysql架構,跟客戶溝通了數據庫選型,最后選擇了達夢數據庫,原因是它是國產數據庫第一股且在中國信息安全測評中心排名第一,而且有豐富的數據遷移方式和比較好的兼容性,適合將舊項目從mysql遷移過渡到夢數據庫中。
我們先是在達夢數據庫官網找到DM8相關產品并下載相關的數據庫安裝包,然后借助windows電腦安裝達夢數據庫的遷移工具進行數據遷移,原項目的數據庫表遷移直接按照遷移工具新建遷移工程進行遷移即可。
三、直播系統國產化項目改造
1.maven項目去除mysql依賴,增加達夢數據庫依賴
2.修改項目數據庫配置連接
3.增加數據庫語言及時區等配置的文件
4.去除數據源wall過濾,不然啟動會報錯
5.注意達夢數據庫大小寫規則
【大小寫敏感設置】
如果想要遷移過來表對象仍然保持小寫,需要勾選“保持對象名大小寫”,后期查詢時,需要使用雙引號查詢;
如果想要遷移過來表對象仍然保持大寫,不需要勾選“保持對象名大小寫”,后期查詢時,不需要使用雙引號查詢,因為會自動轉換成大寫查詢。
【大小寫不敏感】
如果想要遷移過來表對象仍然保持小寫,需要勾選“保持對象名大小寫”,后期查詢時,不需要使用雙引號查詢;
如果想要遷移過來表對象仍然保持大寫,不需要勾選“保持對象名大小寫”,后期查詢時,不需要使用雙引號查詢,因為會自動轉換成大寫查詢。
【查詢大小寫設置】
SELECT CASE_SENSITIVE(); /select PARA_VALUE from v$dm_ini where “V$DM_INI”.PARA_NAME like’%CASE_SENSITIVE’;結果為 1 是大小寫敏感,結果為 0 是不敏感。
針對數據庫大小寫的問題,有兩種解決方式:
1.達夢數據庫配置大小寫敏感并重啟數據庫
2.達夢數據庫及字段創建不使用雙引號
即不指定大小寫,這樣通過sql查詢的時候只要表名或字段不使用雙引號進行包裹書寫,大小寫都可以兼容
6.sql語法注意事項
1.replace替換為merge語句(也可以改為批量刪除再批量insert)
2、達夢支持IGNORE字段,但是需要改造,參數截圖;也可改 INSERT IGNORE INTO 為 INSERT INTO
3、修改獲取主鍵id方式
— 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>
在mysql數據表結構遷移到達夢時,AUTO_INCREMENT會被替換為IDENTITY,從而導致不能使用SELECT LAST_INSERT_ID()
所以,如果要使用SELECT LAST_INSERT_ID(),在數據表結構遷移的時候,選擇不要將AUTO_INCREMENT替換為IDENTITY即可
4.表名user為關鍵字,需要將user使用雙引號括起來,有關鍵字都需要雙引號括起來
user是比較特殊的關鍵字,如果將user作為字段名,不管是否加上雙引號,最終都會返回連接達夢數據庫的用戶名。所以user不能作為字段名,需要替換為其它字段名稱。
關鍵字可參考:https://eco.dameng.com/document/dm/zh-cn/pm/sql-appendix
5.達夢數據庫不支持’符號,需要把所有用’括起來的字段或者表名都要去除該符號或者換成雙引號
【方式1:增加達夢數據庫配置并重啟數據庫】
【方式2:group by需將所有的select 字段(排查聚合函數后)列入】
6.GROUP_CONCAT 要替換成 wm_concat(默認分隔是逗號)
將GROUP_CONCAT(wp.name SEPARATOR ‘,’) 替換為 wm_concat(wp.name),這里的SEPARATOR如果不是默認的逗號,需要使用replace把逗號換成自己需要的。
7.date_add()方法需要改為ADD_DAYS(data,n):+n天 /ADD_MONTHS(date,n):+n月 / ADD_WEEKS(date,n):+n周
8.達夢的convert()函數中的type在前, value在后,而MySQL數據庫中convert()函數則恰恰相反
9.分析函數有 distinct 的時候,不允許 order by 一起使用
10、delete和update都不能跟order by一起使用
11.中文字符長度取決于兩個字段UNICODE_FALG和LENGTH_IN_CHAR:
【- 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個漢字。
11.text太大時不會一次性返回結果
字段為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系列處理器兼容
以上是我們做直播系統信創改造時數據庫部分的經驗總結,希望能幫到大家,有相關疑問留言/私信我(wechat:lei_768768)。