專(zhuān)利名稱(chēng):一種構(gòu)件化軟件系統(tǒng)運(yùn)行狀態(tài)的按需動(dòng)態(tài)持久化方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種構(gòu)件化軟件系統(tǒng)運(yùn)行狀態(tài)的按需動(dòng)態(tài)持久化方法,屬于軟件技術(shù) 領(lǐng)域,適用于軟件的開(kāi)發(fā)與維護(hù)。
背景技術(shù):
持久化是將應(yīng)用使用的存放在內(nèi)存中的數(shù)據(jù)(如對(duì)象)保存到非易失性存儲(chǔ)設(shè)備 (如磁盤(pán)文件、關(guān)系型數(shù)據(jù)庫(kù)、XML數(shù)據(jù)庫(kù)等等)中的一個(gè)過(guò)程。持久化是軟件系統(tǒng)一個(gè)非 常重要的非功能需求。軟件的一些本質(zhì)特性,如軟件需求的變化性和不斷增加的復(fù)雜性等, 決定了在軟件生存周期中,持久化功能的變化是不可避免的。特別是在Internet成為主流 軟件運(yùn)行環(huán)境之后,開(kāi)放、動(dòng)態(tài)、多變的網(wǎng)絡(luò)環(huán)境對(duì)現(xiàn)有持久化技術(shù)提出了新的挑戰(zhàn)軟件 的數(shù)據(jù)需求與數(shù)據(jù)資源在運(yùn)行前可能無(wú)法明確,在運(yùn)行中也可能持續(xù)變化,這種不確定性 的存在導(dǎo)致持久化問(wèn)題的解決無(wú)法一蹴而就,不可避免地需要延伸到運(yùn)行階段,從而要求 持久化技術(shù)具備足夠的動(dòng)態(tài)適應(yīng)能力,即,構(gòu)件屬性與目標(biāo)數(shù)據(jù)源之間綁定和映射關(guān)系的 創(chuàng)建、更新、刪除都可以動(dòng)態(tài)實(shí)現(xiàn)與調(diào)整。由于目前的持久化技術(shù)主要針對(duì)相對(duì)封閉、靜態(tài)、 穩(wěn)定的傳統(tǒng)軟件,僅提供靜態(tài)持久化機(jī)制,應(yīng)用的持久化功能一旦確定并生效執(zhí)行,那么在 運(yùn)行時(shí)刻將無(wú)法被更改,除非中止應(yīng)用的運(yùn)行,修改策略配置文件甚至源碼,再重啟應(yīng)用讓 新的持久化策略生效。這種方式缺乏足夠靈活性,代價(jià)高昂,更為重要的是,Internet使得 數(shù)據(jù)變化的廣度、深度、頻率以及影響均達(dá)到前所未有的程度,此時(shí)的軟件系統(tǒng)往往要求提 供7天X24小時(shí)的不間斷服務(wù),傳統(tǒng)軟件離線調(diào)整持久化功能的方式顯然不適用。此外, 對(duì)于構(gòu)件化軟件系統(tǒng)而言,構(gòu)件往往從市場(chǎng)上購(gòu)得,無(wú)法獲取源代碼,因此對(duì)構(gòu)件持久化功 能的修改也變得困難重重,甚至于完全不可能。簡(jiǎn)言之,現(xiàn)有的針對(duì)靜態(tài)、封閉的傳統(tǒng)軟件 設(shè)計(jì)的持久化技術(shù)在處理Internet環(huán)境下軟件系統(tǒng)的數(shù)據(jù)需求時(shí),缺乏足夠的動(dòng)態(tài)調(diào)整 能力,適用性較差。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種構(gòu)件化軟件系統(tǒng)運(yùn)行狀態(tài)的按需動(dòng)態(tài)持久化方法,本發(fā) 明通過(guò)在開(kāi)發(fā)階段構(gòu)造軟件系統(tǒng)時(shí),將持久化邏輯相關(guān)的代碼從業(yè)務(wù)構(gòu)件中抽取出來(lái),在 部署階段將其注入到軟件系統(tǒng)實(shí)現(xiàn)體之中。在運(yùn)行階段,被注入的持久化邏輯(包括目標(biāo) 數(shù)據(jù)源、持久對(duì)象與目標(biāo)數(shù)據(jù)源數(shù)據(jù)的映射關(guān)系、持久化操作執(zhí)行時(shí)機(jī)等等)并不直接調(diào) 用實(shí)際的持久化機(jī)制,而是對(duì)位于中間層扮演代理角色的持久化控制器進(jìn)行調(diào)用,從而在 持久化控制器協(xié)助下間接地實(shí)現(xiàn)持久化過(guò)程。持久化控制器負(fù)責(zé)監(jiān)控?cái)?shù)據(jù)使用方式的變 化,即,持久化策略配置文件的變動(dòng)。根據(jù)該變化,持久化控制器動(dòng)態(tài)地生成、更新、替換以 及刪除實(shí)際對(duì)軟件系統(tǒng)進(jìn)行持久化的底層機(jī)制,調(diào)整構(gòu)件化軟件系統(tǒng)運(yùn)行實(shí)體與目標(biāo)數(shù)據(jù) 源之間的關(guān)聯(lián)和映射關(guān)系,從而可以在無(wú)需改動(dòng)軟件系統(tǒng)實(shí)現(xiàn)體的情況下,動(dòng)態(tài)地調(diào)整系 統(tǒng)的持久化功能,提高系統(tǒng)靈活性,降低開(kāi)發(fā)人員構(gòu)建系統(tǒng)及維護(hù)人員理解系統(tǒng)的難度,最 終導(dǎo)致軟件開(kāi)發(fā)維護(hù)成本的降低。
4
本發(fā)明的技術(shù)方案為一種構(gòu)件化軟件系統(tǒng)運(yùn)行狀態(tài)的按需動(dòng)態(tài)持久化方法,其步驟為1)軟件系統(tǒng)的開(kāi)發(fā)階段,將持久化邏輯相關(guān)的代碼從業(yè)務(wù)代碼中移除并注入到構(gòu) 件允許的插入點(diǎn)處;2)軟件系統(tǒng)的運(yùn)行階段,當(dāng)構(gòu)件屬性的訪問(wèn)方法被調(diào)用時(shí),構(gòu)件發(fā)送請(qǐng)求消息給 持久化控制器;3)持久化控制器接到請(qǐng)求消息后,根據(jù)當(dāng)前運(yùn)行的持久化策略對(duì)目標(biāo)數(shù)據(jù)表進(jìn)行 持久化操作,并返回消息給被調(diào)用的構(gòu)件實(shí)例;4)被調(diào)用的構(gòu)件實(shí)例根據(jù)返回消息中提供的持久化機(jī)制對(duì)目標(biāo)數(shù)據(jù)源進(jìn)行持久 化操作,并將操作結(jié)果通知構(gòu)件。進(jìn)一步的,所述構(gòu)件屬性的訪問(wèn)方法包括寫(xiě)方法、讀方法。進(jìn)一步的,當(dāng)構(gòu)件屬性的寫(xiě)方法被調(diào)用時(shí)a)構(gòu)件以被調(diào)用屬性訪問(wèn)方法的構(gòu)件實(shí)例作為消息的參數(shù),向持久化控制器發(fā)送 寫(xiě)消息;b)持久化控制器查詢(xún)當(dāng)前構(gòu)件實(shí)例所屬的類(lèi)是否被設(shè)置為持久態(tài),如果否,則繼 續(xù)執(zhí)行業(yè)務(wù)邏輯,否則執(zhí)行步驟c);c)持久化控制器獲取當(dāng)前需要被執(zhí)行的賦值方法的名字,并且從該名字中截取出 被賦值操作的構(gòu)件實(shí)例的屬性名;d)持久化控制器檢查當(dāng)前構(gòu)件實(shí)例是否正處于持久化過(guò)程之中,若是,則繼續(xù)執(zhí) 行業(yè)務(wù)邏輯,否則執(zhí)行步驟e);e)持久化控制器檢查該構(gòu)件實(shí)例的元信息,查詢(xún)?cè)摌?gòu)件實(shí)例被賦值的屬性信息, 如果此時(shí)該屬性是該構(gòu)件實(shí)例的主鍵屬性之一,則執(zhí)行步驟f),否則執(zhí)行步驟g);f)持久化控制器檢查該構(gòu)件實(shí)例的所有主鍵屬性,是否全部的主鍵屬性都已賦 值,如果是則更新目標(biāo)數(shù)據(jù)表記錄與對(duì)象,否則繼續(xù)執(zhí)行業(yè)務(wù)邏輯;g)持久化控制器檢查當(dāng)前構(gòu)件實(shí)例的元信息,如果該實(shí)例所有主鍵屬性都已賦 值,并且目標(biāo)數(shù)據(jù)表中存在與主鍵值相關(guān)的紀(jì)錄,則對(duì)目標(biāo)數(shù)據(jù)表的對(duì)應(yīng)記錄進(jìn)行更新操 作。進(jìn)一步的,如果目標(biāo)數(shù)據(jù)表中沒(méi)有與該主鍵值匹配的數(shù)據(jù)記錄,則將該構(gòu)件實(shí)例 的主鍵值作為一條新記錄插入目標(biāo)數(shù)據(jù)表。進(jìn)一步的,將該構(gòu)件實(shí)例的主鍵值作為一條新記錄插入目標(biāo)數(shù)據(jù)表的方法為i)將該構(gòu)件實(shí)例設(shè)置為持久化進(jìn)行態(tài)后,將該構(gòu)件實(shí)例的主鍵值插入目標(biāo)數(shù)據(jù) 表;ii)修改該構(gòu)件實(shí)例的元信息,標(biāo)明該構(gòu)件實(shí)例的狀態(tài)已與目標(biāo)數(shù)據(jù)表中的某紀(jì) 錄關(guān)聯(lián);iii)將該構(gòu)件實(shí)例的狀態(tài)版本號(hào)增加1,以區(qū)別當(dāng)前的構(gòu)件實(shí)例與插入前的構(gòu)件 實(shí)例;iv)重新設(shè)置構(gòu)件類(lèi)中描述該構(gòu)件實(shí)例主鍵屬性的元信息,使得新版本的構(gòu)件類(lèi) 進(jìn)行相應(yīng)改變;ν)修改該構(gòu)件實(shí)例的元信息,標(biāo)明本次持久化操作結(jié)束,然后繼續(xù)執(zhí)行業(yè)務(wù)邏輯。
進(jìn)一步的,當(dāng)構(gòu)件屬性的讀方法被調(diào)用時(shí)a)構(gòu)件以被調(diào)用屬性訪問(wèn)方法的構(gòu)件實(shí)例作為消息的參數(shù)向持久化控制器發(fā)送 讀消息;b)持久化控制器查詢(xún)當(dāng)前構(gòu)件實(shí)例所屬的類(lèi)是否被設(shè)置為持久態(tài),如果否,則繼 續(xù)執(zhí)行業(yè)務(wù)邏輯,否則執(zhí)行步驟c);c)持久化控制器獲取當(dāng)前需要被執(zhí)行的值查詢(xún)方法的名字,并且獲取值查詢(xún)方法 的返回值類(lèi)型如果是對(duì)象引用值類(lèi)型的屬性,則首先從目標(biāo)數(shù)據(jù)庫(kù)中加載該對(duì)象對(duì)應(yīng)的 數(shù)據(jù)紀(jì)錄,并用該記錄實(shí)例化該目標(biāo)對(duì)象實(shí)例,然后返回主鍵的屬性取值;如果是非對(duì)象引 用值類(lèi)型的屬性,對(duì)于主鍵屬性,直接返回其取值,對(duì)于非主鍵屬性,先確認(rèn)該構(gòu)件實(shí)例的 主鍵屬性值是否有對(duì)應(yīng)的數(shù)據(jù)記錄存在于目標(biāo)數(shù)據(jù)表中,如果存在,則查詢(xún)目標(biāo)數(shù)據(jù)表中 的對(duì)應(yīng)紀(jì)錄,從中獲取該非主鍵屬性對(duì)應(yīng)的值,賦給該屬性之后,再返回主鍵屬性值。進(jìn)一步的,采用持久化工具注入將持久化相關(guān)邏輯代碼注入到構(gòu)件運(yùn)行的插入 點(diǎn)ο進(jìn)一步的,所述插入點(diǎn)包括構(gòu)件的構(gòu)造時(shí)刻、構(gòu)件的銷(xiāo)毀時(shí)刻、構(gòu)件的修改時(shí)刻。進(jìn)一步的,所述持久化控制器監(jiān)測(cè)系統(tǒng)的持久化策略配置文件的變動(dòng),維護(hù)持久 化策略,其方法為持久化控制器運(yùn)行一策略配置文件監(jiān)控線程,如果策略配置文件出現(xiàn)變 化,則持久化控制器根據(jù)新的持久化策略配置文件動(dòng)態(tài)地創(chuàng)建出新的持久化會(huì)話,解除運(yùn) 行態(tài)的構(gòu)件實(shí)例與原持久化會(huì)話之間的托管關(guān)系,然后將運(yùn)行態(tài)的構(gòu)件實(shí)例與新持久化會(huì) 話建立關(guān)聯(lián),最后刪除原持久化會(huì)話。本發(fā)明包含兩部分內(nèi)容1、構(gòu)件化軟件持久化功能的分離和間接持久化功能的注 入;2、運(yùn)行階段持久化策略的動(dòng)態(tài)調(diào)整機(jī)制。具體技術(shù)方案如下軟件系統(tǒng)的持久化功能在運(yùn)行時(shí)刻能夠被按需動(dòng)態(tài)調(diào)整,需要實(shí)現(xiàn)兩個(gè)目標(biāo) 1.持久化策略獨(dú)立于應(yīng)用實(shí)現(xiàn)體進(jìn)行配置;2.調(diào)整后的持久化策略能夠?qū)λ姓谶\(yùn)行 中的業(yè)務(wù)構(gòu)件即時(shí)生效。(1)構(gòu)件化軟件持久化功能分離和間接持久化功能的注入。分離是指將持久化邏 輯相關(guān)的代碼從業(yè)務(wù)代碼中去除;注入是指定義一套可配置的持久化策略,通過(guò)某種方式 (如AOP技術(shù))將配置后的持久化策略自動(dòng)應(yīng)用到業(yè)務(wù)代碼中。針對(duì)按需動(dòng)態(tài)持久化的第 一個(gè)目標(biāo),在軟件系統(tǒng)的開(kāi)發(fā)階段,通過(guò)持久化邏輯的分離和注入以達(dá)到消除應(yīng)用業(yè)務(wù)代 碼對(duì)持久層接口的直接依賴(lài)的目的。即,構(gòu)件化軟件系統(tǒng)的持久化功能并不直接由構(gòu)件本 身實(shí)現(xiàn),而是在構(gòu)件允許的插入點(diǎn)(例如構(gòu)件的構(gòu)造、銷(xiāo)毀、修改時(shí))處由持久化工具注入。 同時(shí),為了確保持久化功能的在線可調(diào)整性,被注入的持久化邏輯并非直接對(duì)軟件系統(tǒng)的 狀態(tài)進(jìn)行持久化,而是對(duì)位于中間件層的持久化控制器的調(diào)用,即,當(dāng)構(gòu)件屬性的訪問(wèn)(讀 /寫(xiě))方法被調(diào)用時(shí),構(gòu)件并不直接調(diào)用持久化機(jī)制進(jìn)行實(shí)際的持久化操作,而是向持久化 控制器發(fā)送消息,將會(huì)由持久化控制器決定此時(shí)是否需要執(zhí)行持久化操作以及執(zhí)行何種持 久化操作,具體情況見(jiàn)下段。相比于直接注入目標(biāo)明確的持久化操作的軟件系統(tǒng),本發(fā)明采 取的是間接注入方式的持久化操作,因此持久化所需的數(shù)據(jù)訪問(wèn)操作并未被固化在軟件系 統(tǒng)實(shí)現(xiàn)體中,從而更有利于在運(yùn)行期進(jìn)行動(dòng)態(tài)調(diào)整。(2)運(yùn)行階段持久化策略的動(dòng)態(tài)調(diào)整機(jī)制。針對(duì)動(dòng)態(tài)持久化的第二個(gè)目標(biāo),為了讓所有運(yùn)行態(tài)的構(gòu)件實(shí)例都能及時(shí)按照新的持久化策略運(yùn)作,需要一個(gè)居于中間層的持久化 控制器來(lái)負(fù)責(zé)獲取和維護(hù)軟件系統(tǒng)構(gòu)件的持久化元信息該控制器會(huì)讀取持久化策略配置 文件,獲取各個(gè)構(gòu)件實(shí)例的持久化元信息包括構(gòu)件的哪些屬性需要被持久化、哪些屬性與 其他構(gòu)件存在關(guān)聯(lián)關(guān)系等等,從而計(jì)算出各個(gè)構(gòu)件實(shí)例能夠被持久化需要滿(mǎn)足的條件,以 精確協(xié)調(diào)和控制構(gòu)件實(shí)例的每一次狀態(tài)改變和查詢(xún)的行為(如附圖2、3所示),對(duì)構(gòu)件實(shí)例 而言,其狀態(tài)被改變和查詢(xún)的時(shí)刻存在兩種情況,即,每個(gè)屬性的賦值方法setter和值查 詢(xún)方法getter被調(diào)用的時(shí)刻。其各自觸發(fā)的持久化控制器的執(zhí)行邏輯分別描述如下如圖2所示,屬性賦值方法setter的執(zhí)行邏輯1.構(gòu)件實(shí)例向持久化控制器發(fā)送“寫(xiě)”消息,以被調(diào)用屬性訪問(wèn)方法的構(gòu)件實(shí)例本 身作為消息的參數(shù)。持久化控制器查詢(xún)?cè)摌?gòu)件實(shí)例的所屬的類(lèi)是否被設(shè)置為持久態(tài),如果 否,則直接返回,否則進(jìn)入以下步驟;2.持久化控制器通過(guò)AOP提供的反射能力,獲得當(dāng)前需要被執(zhí)行的賦值方法的名 字,并且從該名字中截取出被賦值操作的構(gòu)件實(shí)例的屬性名;3.持久化控制器檢查當(dāng)前構(gòu)件實(shí)例是否正處于某個(gè)持久化過(guò)程之中,若是,則返 回,否則,進(jìn)入以下步驟;4.持久化控制器檢查該構(gòu)件實(shí)例的元信息,查詢(xún)?cè)摌?gòu)件實(shí)例被賦值的屬性信息, 如果此時(shí)該屬性是該構(gòu)件實(shí)例的主鍵屬性之一,則進(jìn)入步驟5,否則跳到步驟7 ;5.持久化控制器檢查該構(gòu)件實(shí)例的所有主鍵屬性,是否全部的主鍵屬性都已經(jīng)完 成賦值,如果為真,則進(jìn)入6,準(zhǔn)備插入一條數(shù)據(jù)庫(kù)記錄,否則,直接返回。6.持久化控制器使用了具體的持久化機(jī)制如Hibernate來(lái)持久化構(gòu)件實(shí)例。以 Hibernate為例,Hibernate的SessionFactory結(jié)構(gòu)在控制器中初始化。持久化控制器調(diào) 用 HibernateSessionFactory 的 getCurrentSession 方法獲得一個(gè) Session 實(shí)例來(lái)開(kāi)始一 次對(duì)目標(biāo)數(shù)據(jù)庫(kù)的操作。在調(diào)用該Session實(shí)例插入記錄之前,嘗試更新數(shù)據(jù)表記錄與對(duì) 象(即如果數(shù)據(jù)庫(kù)中有這樣一條記錄,則update,否則就insert),如果成功則返回;如果失 敗,則表明目標(biāo)數(shù)據(jù)表中尚不存在和該主鍵值匹配的數(shù)據(jù)記錄,因此需要先將該主鍵值作 為一條新記錄插入目標(biāo)數(shù)據(jù)表,具體過(guò)程為先把構(gòu)件實(shí)例的設(shè)置為持久化進(jìn)行態(tài),以避免 在本次持久化進(jìn)行的同時(shí)又出現(xiàn)對(duì)該實(shí)例狀態(tài)的持久化操作,導(dǎo)致死循環(huán);在該主鍵值插 入目標(biāo)數(shù)據(jù)表之后,會(huì)執(zhí)行以下操作i).修改該實(shí)例的相關(guān)元信息,標(biāo)明該實(shí)例的狀態(tài)已 經(jīng)和目標(biāo)數(shù)據(jù)表中的某個(gè)記錄相關(guān)聯(lián)了 ;ii).將構(gòu)件實(shí)例的狀態(tài)版本號(hào)version增加1,以 區(qū)別當(dāng)前的構(gòu)件實(shí)例與插入前的構(gòu)件實(shí)例(它們分別對(duì)應(yīng)數(shù)據(jù)表中的兩條記錄);iii).重 新設(shè)置構(gòu)件類(lèi)的描述其主鍵屬性的元信息,因?yàn)檫\(yùn)行時(shí)刻構(gòu)件的主鍵屬性的集合可能會(huì)發(fā) 生變化,重新修改元信息能夠保證新版本的構(gòu)件類(lèi)能夠及時(shí)作出相應(yīng)改變;iv)修改實(shí)例 的元信息,表明本次持久化操作結(jié)束,然后返回。7.持久化控制器檢查當(dāng)前構(gòu)件實(shí)例的元信息,如果該實(shí)例所有主鍵屬性都已經(jīng)完 成了賦值,并且目標(biāo)數(shù)據(jù)表中已經(jīng)存在了與該構(gòu)件實(shí)例匹配的記錄,那么,當(dāng)前是對(duì)該構(gòu)件 實(shí)例的某個(gè)非主鍵屬性執(zhí)行賦值方法,因此需要進(jìn)行對(duì)目標(biāo)數(shù)據(jù)表的對(duì)應(yīng)的數(shù)據(jù)記錄進(jìn)行 更新操作。如圖3所示,屬性值查詢(xún)方法getter的執(zhí)行邏輯跟賦值方法相比,值查詢(xún)方法較為簡(jiǎn)單,在構(gòu)件實(shí)例屬性的值查詢(xún)方法被調(diào)用的
7時(shí)刻,構(gòu)件向持久化控制器發(fā)送“讀”消息,以構(gòu)件實(shí)例作為消息的參數(shù)。持久化控制器查詢(xún) 該構(gòu)件實(shí)例的所屬的類(lèi)是否被設(shè)置為持久態(tài),如果否,則直接返回屬性值,否則進(jìn)入以下步 驟;持久化控制器通過(guò)AOP提供的反射能力,獲得當(dāng)前需要被執(zhí)行的值查詢(xún)方法的名字,并 且獲取值查詢(xún)方法的返回值類(lèi)型,如果是對(duì)象引用值類(lèi)型的屬性,則需要首先從目標(biāo)數(shù)據(jù) 庫(kù)中加載該對(duì)象的對(duì)應(yīng)的數(shù)據(jù)記錄,并用該記錄實(shí)例化該目標(biāo)對(duì)象實(shí)例,然后返回主鍵的 屬性取值;如果是非對(duì)象引用值類(lèi)型的屬性,即,普通值屬性,那么對(duì)于主鍵屬性,直接返回 其取值即可;對(duì)于非主鍵屬性,持久化控制器需要先去確認(rèn)該實(shí)例的主鍵屬性值是否有對(duì) 應(yīng)的數(shù)據(jù)記錄存在于目標(biāo)數(shù)據(jù)表中,如果存在,則還需要去查詢(xún)目標(biāo)數(shù)據(jù)表中的對(duì)應(yīng)記錄, 從中獲取該非主鍵屬性對(duì)應(yīng)的值,賦給該屬性之后,再返回主鍵屬性值。這個(gè)持久化控制器同時(shí)監(jiān)測(cè)系統(tǒng)的持久化策略配置文件的變動(dòng),及時(shí)發(fā)現(xiàn)和獲取 新設(shè)定的持久化策略,并按需動(dòng)態(tài)地生成、更新、切換以及刪除的相應(yīng)的持久化策略(如附 圖1所示)。實(shí)現(xiàn)方法是持久化控制器會(huì)一直在后臺(tái)執(zhí)行一個(gè)監(jiān)控線程,監(jiān)測(cè)策略配置 文件的變動(dòng),一旦監(jiān)測(cè)出變化,由于構(gòu)件類(lèi)和數(shù)據(jù)庫(kù)表之間的映射策略由實(shí)際持久化機(jī)制 Hibernate的持久化Session (Session 即持久化會(huì)話。一個(gè)持久化會(huì)話可以理解為一次持 久化邏輯的執(zhí)行過(guò)程。)負(fù)責(zé)實(shí)現(xiàn),而每個(gè)Session都是利用一種策略配置文件實(shí)現(xiàn)的,因 此持久化控制器只需要根據(jù)新的持久化策略配置文件動(dòng)態(tài)地創(chuàng)建出新的持久化Session, 解除運(yùn)行態(tài)的構(gòu)件實(shí)例和原有的已經(jīng)不合需求的Session之間的托管關(guān)系,然后將其和新 Session關(guān)聯(lián)起來(lái),最后銷(xiāo)毀掉已經(jīng)不合需求的Session,就可以無(wú)需中止應(yīng)用系統(tǒng)的運(yùn)行 而實(shí)現(xiàn)持久化策略的動(dòng)態(tài)調(diào)整了??傊ㄟ^(guò)以上描述,可以看出,作為實(shí)現(xiàn)按需動(dòng)態(tài)持久化的核心組件,持久化控 制器主要功能是負(fù)責(zé)記錄和維護(hù)構(gòu)件運(yùn)行時(shí)的持久化元信息,以協(xié)調(diào)構(gòu)件實(shí)例的持久化操 作。即負(fù)責(zé)讀取持久化策略的配置文件、獲取并緩存用戶(hù)對(duì)所有構(gòu)件的持久化元信息、通過(guò) JDBC等規(guī)范的數(shù)據(jù)訪問(wèn)接口建立到持久化策略的配置文件指定的目標(biāo)數(shù)據(jù)源的連接、開(kāi)啟 后臺(tái)監(jiān)控線程監(jiān)測(cè)配置文件的改變。當(dāng)某個(gè)構(gòu)件實(shí)例com的屬性訪問(wèn)方法被調(diào)用時(shí),com并 不直接執(zhí)行數(shù)據(jù)訪問(wèn)操作,而是首先發(fā)請(qǐng)求給持久化控制器,控制器接到該請(qǐng)求后,根據(jù)自 己緩存的正在使用的持久化策略,以及調(diào)用底層持久化機(jī)制對(duì)目標(biāo)數(shù)據(jù)表進(jìn)行必要的查詢(xún) 后,返回消息給com,告知com應(yīng)該以何種方式操作自身屬性的狀態(tài),其方式主要包括直接 從內(nèi)存中操作屬性、對(duì)目標(biāo)數(shù)據(jù)源中持久對(duì)象對(duì)應(yīng)的數(shù)據(jù)庫(kù)中的記錄進(jìn)行查詢(xún)/更新等持 久化操作;com接到回復(fù)后使用控制器提供的實(shí)際持久化機(jī)制并按其指示在目標(biāo)數(shù)據(jù)源上 執(zhí)行持久化操作,將操作結(jié)果以消息的機(jī)制通知構(gòu)件。另一方面,在運(yùn)行時(shí)刻,持久化控制 器會(huì)一直在后臺(tái)執(zhí)行一個(gè)監(jiān)控線程,監(jiān)測(cè)策略配置文件的變動(dòng),一旦監(jiān)測(cè)出變化,立即用新 策略替換掉原策略,并相應(yīng)地更換自己所維護(hù)的所有構(gòu)件的持久化元信息,以實(shí)現(xiàn)持久化 功能的動(dòng)態(tài)調(diào)整,這種方法參考自應(yīng)用服務(wù)器技術(shù)中“熱部署”機(jī)制。與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為采用本發(fā)明的按需動(dòng)態(tài)持久化方法,構(gòu)件化軟件系統(tǒng)能夠在無(wú)需修改軟件實(shí)現(xiàn) 體,且無(wú)需系統(tǒng)本身主動(dòng)感知變化,就可以獲得在運(yùn)行時(shí)對(duì)自身的持久化功能進(jìn)行在線調(diào) 整的能力,從而更加有效地抵御開(kāi)放、動(dòng)態(tài)、多變網(wǎng)絡(luò)環(huán)境下用戶(hù)數(shù)據(jù)需求和數(shù)據(jù)資源的多 變性導(dǎo)致的風(fēng)險(xiǎn),降低了軟件系統(tǒng)持久化功能開(kāi)發(fā)的復(fù)雜度和難度,提高了軟件的可靠性。
8
圖1、本發(fā)明的動(dòng)態(tài)持久化方法結(jié)構(gòu)圖;圖2、本發(fā)明構(gòu)件屬性賦值方法流程圖;圖3、本發(fā)明構(gòu)件屬性值查詢(xún)方法流程圖。
具體實(shí)施例方式本節(jié)給出一個(gè)基于AOP (Aspect-Oriented Programming,面向側(cè)面編程)思想的 動(dòng)態(tài)持久化技術(shù)的實(shí)現(xiàn)過(guò)程示例。將持久化邏輯相關(guān)代碼從應(yīng)用業(yè)務(wù)邏輯中完整地抽取出 來(lái),封裝在持久化側(cè)面中(持久化邏輯在實(shí)現(xiàn)時(shí)以持久化側(cè)面的形式存在),再定制地編織 到軟件系統(tǒng)的各個(gè)業(yè)務(wù)模塊中,使得業(yè)務(wù)代碼中無(wú)需出現(xiàn)任何持久化邏輯相關(guān)的代碼。持 久化側(cè)面的插入位置是應(yīng)用系統(tǒng)中所有POJO (Plain Old Java Object,指不需要實(shí)現(xiàn)任何 額外接口的普通Java對(duì)象)對(duì)象類(lèi)屬性的訪問(wèn)方法(getter/setter)的前后。持久化側(cè)面 可以利用AspectK目前基于Java的最完整的AOP實(shí)現(xiàn))實(shí)現(xiàn)。在POJO對(duì)象類(lèi)的持久化 動(dòng)作被觸發(fā)的時(shí)刻,持久化側(cè)面封裝的持久化邏輯將調(diào)用持久化控制器,控制器根據(jù)當(dāng)前 的持久策略及時(shí)地調(diào)整構(gòu)件的持久化行為,以一種間接的方式完成所需的數(shù)據(jù)訪問(wèn)操作。為了驗(yàn)證本發(fā)明提出的按需持久化方法的有效性,選取一個(gè)開(kāi)源免費(fèi)的計(jì)算器程 序。該程序是一個(gè)簡(jiǎn)單的Java Applet,類(lèi)似Windows計(jì)算器。該程序含有一個(gè)Class文 件,其中只有一個(gè)Calc類(lèi)。首先,在不改動(dòng)Calc類(lèi)源碼的情況下,為其編寫(xiě)持久化配置文 件,選取其左右操作數(shù)、運(yùn)算符、運(yùn)算結(jié)果、以及存儲(chǔ)器值為需要被持久化的屬性,目標(biāo)數(shù)據(jù) 表為tbl。使用持久化工具為其注入持久化邏輯后啟動(dòng)程序,進(jìn)行運(yùn)算,可以發(fā)現(xiàn),原本不 具備持久化功能的計(jì)算器Calc此時(shí)會(huì)把運(yùn)算的狀態(tài)寫(xiě)進(jìn)數(shù)據(jù)表tbl中。而后,不關(guān)閉計(jì)算 器,讓其繼續(xù)運(yùn)行。此時(shí)修改配置文件調(diào)整持久化策略將目標(biāo)數(shù)據(jù)表改為tb2 ;然后再次 進(jìn)行運(yùn)算,此時(shí)新目標(biāo)數(shù)據(jù)表tb2中將會(huì)出現(xiàn)計(jì)算器運(yùn)行狀態(tài)的記錄。說(shuō)明該應(yīng)用的持久 化功能已經(jīng)成功地被動(dòng)態(tài)地調(diào)整。
權(quán)利要求
一種構(gòu)件化軟件系統(tǒng)運(yùn)行狀態(tài)的按需動(dòng)態(tài)持久化方法,其步驟為1)軟件系統(tǒng)的開(kāi)發(fā)階段,將持久化邏輯相關(guān)的代碼從業(yè)務(wù)代碼中移除并注入到構(gòu)件允許的插入點(diǎn)處;2)軟件系統(tǒng)的運(yùn)行階段,當(dāng)構(gòu)件屬性的訪問(wèn)方法被調(diào)用時(shí),構(gòu)件發(fā)送請(qǐng)求消息給持久化控制器;3)持久化控制器接到請(qǐng)求消息后,根據(jù)當(dāng)前運(yùn)行的持久化策略對(duì)目標(biāo)數(shù)據(jù)表進(jìn)行持久化操作,并返回消息給被調(diào)用的構(gòu)件實(shí)例;4)被調(diào)用的構(gòu)件實(shí)例根據(jù)返回消息中提供的持久化機(jī)制對(duì)目標(biāo)數(shù)據(jù)源進(jìn)行持久化操作,并將操作結(jié)果通知構(gòu)件。
2.如權(quán)利要求1所述的方法,其特征在于所述構(gòu)件屬性的訪問(wèn)方法包括寫(xiě)方法、讀方法。
3.如權(quán)利要求2所述的方法,其特征在于當(dāng)構(gòu)件屬性的寫(xiě)方法被調(diào)用時(shí)a)構(gòu)件以被調(diào)用屬性訪問(wèn)方法的構(gòu)件實(shí)例作為消息的參數(shù),向持久化控制器發(fā)送寫(xiě)消息;b)持久化控制器查詢(xún)當(dāng)前構(gòu)件實(shí)例所屬的類(lèi)是否被設(shè)置為持久態(tài),如果否,則繼續(xù)執(zhí) 行業(yè)務(wù)邏輯,否則執(zhí)行步驟c);c)持久化控制器獲取當(dāng)前需要被執(zhí)行的賦值方法的名字,并且從該名字中截取出被賦 值操作的構(gòu)件實(shí)例的屬性名;d)持久化控制器檢查當(dāng)前構(gòu)件實(shí)例是否正處于持久化過(guò)程之中,若是,則繼續(xù)執(zhí)行業(yè) 務(wù)邏輯,否則執(zhí)行步驟e);e)持久化控制器檢查該構(gòu)件實(shí)例的元信息,查詢(xún)?cè)摌?gòu)件實(shí)例被賦值的屬性信息,如果 此時(shí)該屬性是該構(gòu)件實(shí)例的主鍵屬性之一,則執(zhí)行步驟f),否則執(zhí)行步驟g);f)持久化控制器檢查該構(gòu)件實(shí)例的所有主鍵屬性,是否全部的主鍵屬性都已賦值,如 果是則更新目標(biāo)數(shù)據(jù)表記錄與對(duì)象,否則繼續(xù)執(zhí)行業(yè)務(wù)邏輯;g)持久化控制器檢查當(dāng)前構(gòu)件實(shí)例的元信息,如果該實(shí)例所有主鍵屬性都已賦值,并 且目標(biāo)數(shù)據(jù)表中存在與主鍵值相關(guān)的紀(jì)錄,則對(duì)目標(biāo)數(shù)據(jù)表的對(duì)應(yīng)記錄進(jìn)行更新操作。
4.如權(quán)利要求1或2或3所述的方法,其特征在于如果目標(biāo)數(shù)據(jù)表中沒(méi)有與該主鍵值 匹配的數(shù)據(jù)記錄,則將該構(gòu)件實(shí)例的主鍵值作為一條新記錄插入目標(biāo)數(shù)據(jù)表。
5.如權(quán)利要求4所述的方法,其特征在于將該構(gòu)件實(shí)例的主鍵值作為一條新記錄插入 目標(biāo)數(shù)據(jù)表的方法為i)將該構(gòu)件實(shí)例設(shè)置為持久化進(jìn)行態(tài)后,將該構(gòu)件實(shí)例的主鍵值插入目標(biāo)數(shù)據(jù)表; )修改該構(gòu)件實(shí)例的元信息,標(biāo)明該構(gòu)件實(shí)例的狀態(tài)已與目標(biāo)數(shù)據(jù)表中的某紀(jì)錄關(guān)聯(lián);iii)將該構(gòu)件實(shí)例的狀態(tài)版本號(hào)增加1,以區(qū)別當(dāng)前的構(gòu)件實(shí)例與插入前的構(gòu)件實(shí)例;iv)重新設(shè)置構(gòu)件類(lèi)中描述該構(gòu)件實(shí)例主鍵屬性的元信息,使得新版本的構(gòu)件類(lèi)進(jìn)行 相應(yīng)改變;V)修改該構(gòu)件實(shí)例的元信息,標(biāo)明本次持久化操作結(jié)束,然后繼續(xù)執(zhí)行業(yè)務(wù)邏輯。
6.如權(quán)利要求2所述的方法,其特征在于當(dāng)構(gòu)件屬性的讀方法被調(diào)用時(shí)a)構(gòu)件以被調(diào)用屬性訪問(wèn)方法的構(gòu)件實(shí)例作為消息的參數(shù)向持久化控制器發(fā)送讀消息;b)持久化控制器查詢(xún)當(dāng)前構(gòu)件實(shí)例所屬的類(lèi)是否被設(shè)置為持久態(tài),如果否,則繼續(xù)執(zhí) 行業(yè)務(wù)邏輯,否則執(zhí)行步驟c);c)持久化控制器獲取當(dāng)前需要被執(zhí)行的值查詢(xún)方法的名字,并且獲取值查詢(xún)方法的返 回值類(lèi)型如果是對(duì)象引用值類(lèi)型的屬性,則首先從目標(biāo)數(shù)據(jù)庫(kù)中加載該對(duì)象對(duì)應(yīng)的數(shù)據(jù) 紀(jì)錄,并用該記錄實(shí)例化該目標(biāo)對(duì)象實(shí)例,然后返回主鍵的屬性取值;如果是非對(duì)象引用值 類(lèi)型的屬性,對(duì)于主鍵屬性,直接返回其取值,對(duì)于非主鍵屬性,先確認(rèn)該構(gòu)件實(shí)例的主鍵 屬性值是否有對(duì)應(yīng)的數(shù)據(jù)記錄存在于目標(biāo)數(shù)據(jù)表中,如果存在,則查詢(xún)目標(biāo)數(shù)據(jù)表中的對(duì) 應(yīng)紀(jì)錄,從中獲取該非主鍵屬性對(duì)應(yīng)的值,賦給該屬性之后,再返回主鍵屬性值。
7.如權(quán)利要求2或3或6所述的方法,其特征在于采用持久化工具注入將持久化相關(guān) 邏輯代碼注入到構(gòu)件運(yùn)行的插入點(diǎn)。
8.如權(quán)利要求7所述的方法,其特征在于所述插入點(diǎn)包括構(gòu)件的構(gòu)造時(shí)刻、構(gòu)件的銷(xiāo) 毀時(shí)刻、構(gòu)件的修改時(shí)刻。
9.如權(quán)利要求1或2或3或6所述的方法,其特征在于所述持久化控制器監(jiān)測(cè)系統(tǒng)的 持久化策略配置文件的變動(dòng),維護(hù)持久化策略,其方法為持久化控制器運(yùn)行一策略配置文 件監(jiān)控線程,如果策略配置文件出現(xiàn)變化,則持久化控制器根據(jù)新的持久化策略配置文件 動(dòng)態(tài)地創(chuàng)建出新的持久化會(huì)話,解除運(yùn)行態(tài)的構(gòu)件實(shí)例與原持久化會(huì)話之間的托管關(guān)系, 然后將運(yùn)行態(tài)的構(gòu)件實(shí)例與新持久化會(huì)話建立關(guān)聯(lián),最后刪除原持久化會(huì)話。
全文摘要
本發(fā)明公開(kāi)了一種構(gòu)件化軟件系統(tǒng)運(yùn)行狀態(tài)的按需動(dòng)態(tài)持久化方法,屬于軟件技術(shù)領(lǐng)域。本發(fā)明通過(guò)在開(kāi)發(fā)階段構(gòu)造軟件系統(tǒng)時(shí),將持久化邏輯相關(guān)的代碼從業(yè)務(wù)構(gòu)件中抽取出來(lái)并將其注入到軟件系統(tǒng)實(shí)現(xiàn)體之中;在運(yùn)行階段,被注入的持久化邏輯并不直接調(diào)用實(shí)際的持久化機(jī)制,而是對(duì)持久化控制器進(jìn)行調(diào)用,從而在持久化控制器協(xié)助下間接地實(shí)現(xiàn)持久化過(guò)程。與現(xiàn)有技術(shù)相比,本發(fā)明可以在無(wú)需改動(dòng)軟件系統(tǒng)實(shí)現(xiàn)體的情況下,動(dòng)態(tài)地調(diào)整系統(tǒng)的持久化功能,提高系統(tǒng)靈活性,降低開(kāi)發(fā)人員構(gòu)建系統(tǒng)及維護(hù)人員理解系統(tǒng)的難度,最終導(dǎo)致軟件開(kāi)發(fā)維護(hù)成本的降低。
文檔編號(hào)G06F9/44GK101944028SQ20101029478
公開(kāi)日2011年1月12日 申請(qǐng)日期2010年9月28日 優(yōu)先權(quán)日2010年9月28日
發(fā)明者梅宏, 滕騰, 陳興潤(rùn), 黃罡 申請(qǐng)人:北京大學(xué)