999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種.NET環境下敏捷數據持久化框架的設計與實現

2023-10-27 00:50:27肖志勇
現代信息科技 2023年17期

摘? 要:文章論述了直接使用數據庫程序應用接口的不足并對當前流行的數據持久化框架技術特點進行了分析。結合項目的具體需求,參考當前已有的數據持久化框架的設計思路給出一種利用自定義屬性和反射技術實現對象關系映射功能與數據本地持久化的軟件框架的設計與實現,該框架除實現對象關系映射功能外,對項目所需數據關聯關系的體現、數據的快速查找與本地持久化等功能均有較好的支持。

關鍵詞:.NET;自定義屬性;反射;數據持久化;XML;NoSQL

中圖分類號:TP311? 文獻標識碼:A? 文章編號:2096-4706(2023)17-0027-05

Design and Implementation of a Agile Data Persistence Framework under the .NET Environment

XIAO Zhiyong

(The 713th Search Institute of CSSC, Zhengzhou? 450015, China)

Abstract: This paper describes the shortage of using database API directly and analyzes the current popular data persistence framework technical characteristics. Combined with the specific requirements of the project, referring to the design mentalities of the current existing data persistence framework, this paper gives a kind of design and implementation of software framework by using custom attributes and reflection technology to achieve the object relationship mapping function and data local persistence. In addition to realizing the object relationship mapping function, this framework provides convenient support for the embodiment of data association required by the project, rapid data search and local persistence and other functions.

Keywords: .NET; custom attribute; reflection; data persistence; XML; NoSQL

0? 引? 言

ORM(Object Relational Mapping)框架通過面向對象中的類與類之間的所屬關系表示關系型數據庫中的數據表和表之間依賴關系,是一種只需通過處理相關類對象即可對數據庫中的特定數據進行操作[1]的數據持久化軟件框架。ORM框架為程序操作數據庫數據提供了一種便捷的方法[2],也是開發者解決面向對象開發與數據庫之間的匹配常用的技術手段[3]。

現有ORM框架主要有Hibernate[4,5]、Mybati[6]等,但框架自身在項目開發過程中的應用卻引入了諸如:對使用者沒有完全屏蔽數據庫差異、框架本身邏輯結構與機制復雜較難掌握、數據訪問性能不佳以及框架對數據本地文件方式持久化需求支持不足等問題。

本文以.NET[7]框架為基礎實現了一個敏捷的數據持久化框架,框架本身通過采用ORM技術在屏蔽底層數據庫差異的同時兼顧數據的查找效率并利用基于XML的序列化和反序列化方法完成數據的本地持久化功能[8,9]。

1? ORM框架的目標與設計思路

1.1? 主要設計目標

根據項目實際需求,當前設計的ORM框架應具備以下特點:

1)約定優于配置(convention over configuration),數據模型自身不能引入其他配置信息;

2)應充分考慮通過數據模型展示數據間關系的直觀性;

3)在數據組織上應考慮查找效率;

4)應支持數據的本地持久化需求;

5)操作數據的邏輯應盡可能復用,提高軟件開發生產率、降低代碼規模。

1.2? 設計思路

數據庫訪問框架均支持從數據庫當中提取數據然后生成對應的數據集合的功能。應用程序可以很容易地通過框架提供的數據訪問功能接口讀取數據庫中指定的數據集合。

但反過來,當某個描述數據庫表的數據集合或該集合中的數據元素(即數據表中的記錄)被修改后,由于該集合或該集合中的元素中沒有包含除數據內容以外的其他數據庫相關信息,因此對該集合或該集合中元素進行的修改無法直接被保存到數據庫對應的表中,相關操作均需在軟件業務層面給予維護,增加了系統業務層的邏輯復雜性。應用程序與數據庫與間的數據交互如圖1所示。

屬性是一種向類型添加信息并影響類型行為的方法[10],它是面向對象特有的RTTI(運行時類型信息)功能的擴展。用戶可以在類的定義過程中通過添加自定義屬性把一些附帶信息標識在該類中(這些包含自定義屬性的類定義下文稱為“數據模型”),在使用數據模型時利用反射機制可以讀取定義的用戶自定義屬性中包含的內容作為業務邏輯的輸入信息。

針對本數據持久化框架中的ORM數據模型,如圖2所示:通過自定義屬性,可以將數據庫相關表定義信息以自定義屬性的方式包含在相應數據模型中。當對應的數據信息出現更改時,由專門的數據解析層將發生的數據更改結合該信息附帶的數據庫定義信息生成對應的數據庫訪問語句,提交數據庫完成對涉及內容的更改。

同時,本文所述框架進一步利用自定義屬性的特性結合基于XML的序列化與反序列化技術,以文件讀寫的方式,可完成數據的本地持久化功能。

綜上所述,與數據庫表對應“數據模型”的自定義屬性添加方式(位置)和內容是本數據持久化方案的關鍵,它直接關系到數據解析層的設計與數據持久化功能的實現方式,同時自定義屬性添加位置與描述內容也是該數據持久化框架與其他采用類似解決方案的數據持久化框架的區別所在。如在文獻[11]中的論述中也提出了采用自定義屬性來對數據庫表定義進行映射的思路,但其自定義屬性的目的是借助自定義屬性生成NHibernate[12]框架運行所需特定數據庫配置類,所述自定義屬性的定義目的和定義方式與本文所述設計理念完全不同。

2? 框架實現

2.1? 數據模型的文法定義

本方案確定通過在描述數據庫表的類中添加描述數據庫表結構的自定義屬性的方式來生成一種包含數據庫表結構相關信息的類。

根據實際需要,當前SQL語言解析層定義了整型、浮點型、字符串、時間日期和字節流五種數據庫數據類型,其他數據類型可在今后的項目開發過程中隨需要進行添加。“DataBaseAttribute”“TableAttribute”“FieldAttribute”和“IdentityAttribute”均為自定義屬性,在下面文法定義表述中被認為是關鍵字。

數據模型數據定義部分的文法定義如下(采用Managed C++描述):

[DataBaseAttribute(數據庫名稱)]

[TableAttribute(表名稱)]

public ref class 類名稱

{

{[FieldAttribute(列名稱,列別名)] {<主鍵標識>}<數據類型> 變量名稱;}

[FieldAttribute(列名稱,列別名)] {<主鍵標識>}<數據類型> 變量名稱;

};

〈主鍵標識〉→[IdentityAttribute(SelfIncrease| Ordinary)]

〈數據類型〉→int | float | String ^ | DateTime/byte[]

數據庫名稱,表名稱,列名稱,列別名,類名稱→〈字符〉﹛〈字符〉 | 〈數字〉﹜

〈數字〉→0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ﹛〈數字〉﹜

〈字符〉→A | B | ‥ | Y | Z | a | b | ‥ | y | z | ﹛〈字符〉﹜

按上述形式定義的數據模型中包含了數據庫表結構中用于生成數據操作語句(SQL)的全部信息。將這些數據模型的實例作為圖2所示數據解析層的輸入,實例附帶的自定義屬性信息(即數據庫表結構信息)和實例自身的變量取值可滿足生成SQL語句的需要,通過生成的SQL語句可以對相應數據庫中的內容進行操作。

在實際的實施過程中,通過編制相關的代碼自動生成工具,讀取數據庫中相關表的結構定義信息(即數據庫中的數據字典),可自動完成數據模型的代碼編制工作。

2.2? 數據關聯關系的描述

關系型數據庫的基本原理是集合論,通過定義二維表和使用笛卡兒乘積描述二維表之間的關系來完成設計[13]。數據間的關系通過二維表來體現,可歸納為:“一對一”“一對多”和“多對多”三種情況。

從面向對象的角度看,對象之間的聚合關系也可歸納為上述三種情況。在工程實現層面,一般將復雜的“多對多”關系通過解耦變為兩個“一對多”的關系給予簡化。同時,從集合的角度看,“一對一”的關系可以被認為是“一對多”關系的特化,因此在實現層面的設計中,只需解決“一對多”數據關系的映射即可較好地描述數據間的關系。

關系型數據庫中,通過二維表之間的“主-外鍵”定義來表現的“一對多”數據關系,綜上所述,該數據關系可以通過定義“主-外鍵”涉及的數據模型類之間的聚合關系來體現。

上述關系在數據庫設計層面、數據模型定義層面和代碼實現層面的示例如圖3所示。在數據庫設計層面,通過主-外鍵關系可以確認TableB為TabelA的從表;在數據模型定義層面,表TabelA對應數據模型與表TableB對應的數據模型之間建立“一對多”聚合關系;在代碼實現層面,表TableA對應的數據模型類提供一個存放TableB數據模型類實例的集合屬性,表TableB對應的數據模型類提供一個存放TableA數據模型類實例的屬性。

在實際實現過程中,同樣可通過編制代碼自動生成工具,讀取數據字典中的各數據表之間的“主-外鍵關系”定義完成相關關系屬性的獲取,以及數據在增加、刪除、修改時數據關聯關系自動維護機制等功能的代碼編制工作。

2.3? NoSQL的數據組織方式與數據本地持久化實現

系統在運行時為了提高數據的響應速率、擴展性以及分布式處理的需求,需要在隨機存儲器(RAM)中構造復雜的對象實例,并且快速地訪問這些對象實例。由于RAM是臨時性的存儲器,如果需要保存系統執行現場,必須使這些復雜對象的生存期跨越程序的執行期,因此借助外部存儲器對這些數據進行持久化[14]操作就成為必然的要求。

綜合考慮上述需求,框架借鑒典型內存數據庫(MMDB)Redis[15]中對數據組織的方式,將當前數據庫中每個表涉及的數據在內存中以行式鍵值模型[16]的方式進行組織,以此提高數據查詢的響應速率并滿足擴展性和分布式處理的需求。

行式鍵值模型的核心是將原關系數據庫表中的每行數據轉變為一個(或若干個)Hash結構,形成一個Key-Value映射集合。利用Key去定位Value在理想狀態下是一個復雜度為O(1)的操作。在本框架的數據組織方案中,Key值不用經過編碼的字符串表示而是將數據表中的主鍵列進行包裝生成一個對應的“鍵值類”,Value值為數據表對應數據模型的實例,實例中每個字段是對應數據的列,其取值為對應列的值。通過重新定義“鍵值類”的Hash值生成機制,確保其Hash算法的正確與高效,進而確保查詢效率。數據處理和組織過程如圖4所示。

由于XML遵循嚴格語法規范,具有擴展性好、數據共享與重用簡單、便于跨平臺傳遞等優點,因此本框架的數據本地持久化方案采用XML的組織方式實現。

由于數據在內存中采用行式鍵值模型的方式進行組織,數據容器本身序列化的思路是:容器內的每一個“Key-Value”元素定義成一個名稱為“item”的節點;對應的Key值作為“item”節點的下一級節點其名稱定義為“key”;對應的Value值同樣作為“item”節點的下一級節點其名稱定義為“value”。同時,數據容器中存放Key和Value的實例由于都是繼承自.NET框架下的object類,因此只需在類定義時標注上框架預定義的自定義屬性標簽即可完成上述對應數據實例的序列化與反序列化功能[17]。

3? 框架實現說明

3.1? ORM驅動層的泛型化實現

泛型是C#編程語言的一種特性,通過使用該特性涉及的泛型類、泛型函數、泛型代理(事件)和泛型接口等元素進行功能實現,使得程序具有更高的抽象度,以此為基礎可顯著提高代碼的復用程度。

泛型編程技術為實現通用的ORM驅動層和數據的本地持久化功能提供了高效可用的技術手段,其實現的各功能模塊關系如圖5所示。

圖中,AbstractDao和Dal類是對不同類型數據庫數據訪問方式的抽象表述;OracleDal是當前支持的Oracle數據庫的ORM驅動層的具體實現,其內部主要數據操作功能函數采用了泛型函數的方式進行定義與實現;TransactionManager用于實現數據庫數據操作的原子性和一致性功能;GenericManager泛型類對OracleDal按IGenericManager泛型接口的定義對數據訪問接口進行封裝,通過該泛型接口對不同數據庫的訪問方式進行標準化定義,為后續框架針對不同數據庫的支持提供便利,同時方便上層業務在不同類型數據庫之間的遷移與部署;GenericRecorderCollection泛型類負責對數據的NoSQL方式的存儲進行組織同時通過其繼承的AbstractXMLSerializer類實現數據的序列化與反序列化以及本地持久化功能。

3.2? 框架各功能模塊邏輯關系

框架各功能部分的邏輯關系如圖6所示。整個框架是一個分層Layer[18]模式的應用,其中的數據庫訪問控制是一個Singleton[19]模式的應用。

系統通過調用數據管理層的相關功能,完成對數據的增、刪、改、查等操作;數據管理層對系統應用屏蔽了描述數據庫表的集合實例,相關的數據操作通過SQL語言解析層被最終反映到數據庫當中。數據庫中的數據通過數據集合生成模塊按數據持久化層對數據的相關要求(數據模型中添加的各種數據庫相關自定義屬性)進行打包,生成描述數據庫表數據集合實例。配置模塊中存放了各層直接需要共享的接口定義,枚舉類型等公共信息。通過底層SQL語言解析層和XML的序列化反序列化功能模塊,框架可以同時實現對數據在遠端和本地的持久化功能。

4? 結? 論

本框架是一個功能齊全的基于ORM設計思想的數據持久化框架,具有數據模型定義簡單、使用方便的優點,在處理“一對多”表關系時非常便捷,適用于以關系型數據庫為中心同時又要求具備較高的數據查詢響應速率對可擴展性、分布式處理以及數據本地持久化有相應需求的應用。

設計與實現過程中,通過遵循基于Layer模式的Class-Type體系結構,各層之間的耦合度較低,整個框架易于擴展、維護。

在基金項目所屬算法仿真平臺的研制過程中,通過應用該框架,項目所需數據之間復雜依賴關系得到較好體現與維護;算法驗證平臺相關數據結構設計與定義實現之間的迭代周期明顯縮短;NoSQL的數據表示方式對該算法驗證平臺的分布式運行起到較好的支持作用。

本框架涉及數據模型定義、數據關系定義、數據的NoSQL組織方式與數據持久化方法等設計思想不僅可在.NET平臺下進行實現,通過利用Qt框架中的MetaObject以及C++語言的模板編程等技術,上述設計思想可基于Qt框架進行實現。

參考文獻:

[1] 丁昊志.對象關系映射模型研究 [D].北京:華北電力大學,2006.

[2] 梁文菲,黃厚寬.對象/關系映射技術與面向對象數據庫技術比較分析 [J].中國科技信息,2006(21):154-156.

[3] AMBLER S W. Mapping objects to relational databases:O/R mapping in detail [EB/OL].[2023-01-26].http://www.agiledata.org/essays/mappingObjects.html.

[4] JOHNSON R,HOELLER J. Expert One-on-One J2EE Development without EJB [M].JavaEye,譯.北京:電子工業出版社,2005.

[5] GAVIN K,CHRISTIAN B. Hibernate 實戰:第2版 [M].蒲成,譯.北京:清華大學出版社,2016.

[6] 陳永政,張正龍.Java EE 框架技術 Spring-MVC+Spring+MyBatis [M].西安:西安電子科技大學出版社,2017:182-204.

[7] Microsoft. .NET Framework 開發人員指南:.NET Framework 概述 [EB/OL].[2023-01-26].https://learn.microsoft.com/zh-cn/dotnet/framework/get-started/overview.

[8] Microsoft. .NET Framework 開發人員指南:編寫自定義屬性 [EB/OL].[2023-01-26].https://docs.microsoft.com/zh-cn/dotnet/standard/attributes/writing-custom-attributes.

[9] Microsoft. NET Framework 開發人員指南:反射 [EB/OL].[2023-01-26].https://docs.microsoft.com/zh-cn/dotnet/framework/reflection-and-codedom/reflection.

[10] L?WY J. .NET組件程序設計:第2版 [M].劉如鴻,譯.北京:電子工業出版社,2007 544-545.

[11] 鐘云.對象關系映射(ORM)的研究與基于C#.NET的部分實現 [D].上海:上海海事大學,2006.

[12] NHibernate. The object-relational mapper for .NET [EB/OL].[2023-01-26].https://www.nhibernate.info/.

[13] 薩師煊.數據庫系統概論:第3版 [M].北京:高等教育出版社,2003:45-82.

[14] 俞建,張燎軍.數據庫訪問技術研究 [J].計算機與現代化,2004(10):29-31.

[15] redis. Documentation [EB/OL].[2023-01-26].https://redis.io/docs/.

[16] 張俊,廖雪花,余旭玲,等.關系型數據庫內存化存儲模型研究 [J].計算機工程與應用,2021,57(19):123-128.

[17] Microsoft. .NET Framework中的對象序列化 [EB/OL].[2023-01-26].https://learn.microsoft.com/zh-cn/previous-versions/dotnet/articles/ms973893(v=msdn.10).

[18] BUSCHMANN F,MEUNIER R,ROHNERT R,等.面向模式的軟件體系結構卷1:模式系統 [M].賁可榮,郭福亮,趙皚,等譯.北京:機械工業出版社,2003:18-19.

[19] GAMMA E,HELM E,JOHNSON R,等.設計模式-可復用面向對象軟件的基礎 [M].李英軍,馬曉星,蔡敏,等譯.北京:機械工業出版社,2000:84-89.

作者簡介:肖志勇(1977—),男,回族,河南新鄉人,高級工程師,工學碩士,研究方向:人工智能與分布式計算。

主站蜘蛛池模板: 亚洲侵犯无码网址在线观看| 天天躁夜夜躁狠狠躁图片| 成人国产精品网站在线看| 午夜欧美理论2019理论| 秋霞午夜国产精品成人片| 亚洲av无码专区久久蜜芽| 久久精品国产999大香线焦| 久久综合丝袜长腿丝袜| 亚洲 欧美 日韩综合一区| 精品国产香蕉伊思人在线| 亚洲首页在线观看| 伊人天堂网| 免费在线色| 一区二区影院| 日日拍夜夜操| 香蕉久久国产精品免| av一区二区三区高清久久| 91色在线视频| 中文字幕免费视频| 久久亚洲AⅤ无码精品午夜麻豆| 亚洲最大福利视频网| 日韩天堂在线观看| 99在线视频免费| 国产女人在线视频| 免费高清自慰一区二区三区| 国产av无码日韩av无码网站| 久久综合色天堂av| 亚洲二区视频| 青青青草国产| 久久伊伊香蕉综合精品| 欧美怡红院视频一区二区三区| 一级毛片在线播放免费观看| 91免费观看视频| 白丝美女办公室高潮喷水视频| 久久中文字幕2021精品| 91欧美在线| 日本午夜三级| 国产永久在线视频| 免费人成黄页在线观看国产| 无码电影在线观看| 国产后式a一视频| 99re精彩视频| 国产97区一区二区三区无码| 伊人婷婷色香五月综合缴缴情| 亚洲成a人片77777在线播放| 女人av社区男人的天堂| 欧美精品不卡| 成人va亚洲va欧美天堂| 亚洲乱码视频| 18禁色诱爆乳网站| 无遮挡国产高潮视频免费观看| 2020亚洲精品无码| 日本精品αv中文字幕| 中文字幕无码av专区久久| 国产黑丝一区| 亚洲欧美成人综合| 91精品国产91久久久久久三级| 国产精品无码制服丝袜| 日日拍夜夜操| 色老二精品视频在线观看| 国产经典在线观看一区| 中文字幕丝袜一区二区| 好久久免费视频高清| 2020国产精品视频| 午夜a视频| 国产视频你懂得| 九九九国产| 欧美色99| 精品国产黑色丝袜高跟鞋| 国产97视频在线观看| 国产毛片片精品天天看视频| 精品国产一区91在线| 波多野结衣中文字幕久久| 91成人精品视频| 狠狠操夜夜爽| 国产在线98福利播放视频免费| 福利在线不卡一区| 免费国产一级 片内射老| 在线亚洲小视频| av在线5g无码天天| 亚洲日韩国产精品综合在线观看| 在线五月婷婷|