唐鋼信息自動化部 胡運杰
按照以往的慣例,數(shù)據(jù)庫用來保存數(shù)據(jù),而對數(shù)據(jù)的處理由相應(yīng)的進程處理。在以前的項目中有過類似的案例,通常的解決思路是MES將XML數(shù)據(jù)寫入本地數(shù)據(jù)庫。數(shù)據(jù)處理進程內(nèi)部會維護一個定時器,該定時器會定時觸發(fā)查詢數(shù)據(jù)庫的新數(shù)據(jù)。進程查詢到新數(shù)據(jù)后,把存儲通信數(shù)據(jù)的XML文檔從數(shù)據(jù)庫內(nèi)讀出,然后按照通信XML的格式進行解析,將解析的結(jié)果存入變量中,最后將解析完的的數(shù)據(jù)寫入數(shù)據(jù)庫。發(fā)送數(shù)據(jù)也一樣,先把待發(fā)送數(shù)據(jù)寫入數(shù)據(jù)庫,數(shù)據(jù)處理進程掃描到新數(shù)據(jù)后將數(shù)據(jù)封裝成XML文件,然后寫入數(shù)據(jù)庫再發(fā)送給MES。目前常用的處理方式有很多亟待解決的問題。所以需要一種全新的處理方法解決上述問題。
原通信的數(shù)據(jù)處理方式簡單直觀,技術(shù)較成熟。但是有一些不能避免的缺點:數(shù)據(jù)流復(fù)雜,系統(tǒng)開銷大,由此導(dǎo)致處理效率低,資源占用高。為了保證數(shù)據(jù)處理進程處理數(shù)據(jù)的即時性,只能縮短數(shù)據(jù)處理進程對數(shù)據(jù)庫進行查詢的周期。這樣的話,即使數(shù)據(jù)庫中沒有新數(shù)據(jù)也要對數(shù)據(jù)庫進行查詢。為了保證通信就需要保持以高頻率查詢數(shù)據(jù)庫。同時數(shù)據(jù)先寫入本地數(shù)據(jù)庫,再由數(shù)據(jù)處理進程讀出解析,再寫入本地數(shù)據(jù)庫,這種處理方式也會額外占用磁盤的讀寫資源。綜上,這種處理方式會導(dǎo)致很多不必要的開銷,而且也不能完全彌補它自身的弊端。
為縮短數(shù)據(jù)處理流程決定去掉后臺的數(shù)據(jù)處理程序,對新數(shù)據(jù)的處理采用觸發(fā)方式,收到新數(shù)據(jù)觸發(fā)解析,沒有新數(shù)據(jù)時沒有額外的資源開銷。減少數(shù)據(jù)的流轉(zhuǎn)過程,數(shù)據(jù)不再交由后臺進程處理,減少服務(wù)器硬盤讀寫操作,降低出錯幾率的同時減少磁盤資源占用,該部分數(shù)據(jù)的處理完全交給數(shù)據(jù)庫操作。數(shù)據(jù)庫直接解析或者封裝XML數(shù)據(jù)并保存處理后的信息。
在與MES通信接口方式中采用傳遞XML文件的方式進行數(shù)據(jù)交換。XML作為輕量級的數(shù)據(jù)儲存文件非常適合系統(tǒng)間的數(shù)據(jù)交換,具有統(tǒng)一的標準語法,并且在傳遞過程中保留了諸如父/子關(guān)系這樣的數(shù)據(jù)結(jié)構(gòu)。在MES系統(tǒng)中由于采用了Tibco中間件,能夠簡單有效的處理XML文件,而在無人天車的系統(tǒng)中只能手動解析處理通信數(shù)據(jù)。
在通信報文中有3條用于生產(chǎn)的步進梁跟蹤數(shù)據(jù)對時間要求較高,需要及時對該數(shù)據(jù)進行處理并下發(fā)給WMS系統(tǒng)。在WMS與A模塊系統(tǒng)中鋼卷信息與鋼卷實物的對應(yīng)關(guān)系依靠步進梁的跟蹤數(shù)據(jù)處理。如果步進梁跟蹤數(shù)據(jù)滯后或者不準確會導(dǎo)致嚴重的安全問題。其它生產(chǎn)數(shù)據(jù)也需要及時獲取并處理,所以及時準確與MES通信非常重要。
在以前的技術(shù)解決方案中,數(shù)據(jù)庫不僅作為最后結(jié)果的存儲器,也可以用作各個處理進程間的“共享緩沖”使用。使用數(shù)據(jù)庫作為“共享緩存”的弊端就是速度慢、開銷大。經(jīng)過技術(shù)攻關(guān)決定采用新的數(shù)據(jù)處理結(jié)構(gòu),從根本上解決通信及時性問題。接收MES數(shù)據(jù)時,本地數(shù)據(jù)觸發(fā)器觸發(fā)新數(shù)據(jù)的解析處理,然后將解析后的數(shù)據(jù)存入本地。向MES發(fā)送數(shù)據(jù)時,本地數(shù)據(jù)庫觸發(fā)數(shù)據(jù)封裝處理,封裝完成后存入MES遠程數(shù)據(jù)表。很明顯如果這樣處理極大的提高了處理效率,并且降低了資源開銷。因為老的處理結(jié)構(gòu)并沒有把全部系統(tǒng)資源用于處理數(shù)據(jù),而是浪費在了等待、掃描新數(shù)據(jù)和無用的重復(fù)讀寫上面。
通過查閱有關(guān)XML的資料發(fā)現(xiàn),XML文檔雖然是線性存儲的文檔,但是其內(nèi)部的標準格式能保存完整的數(shù)據(jù)結(jié)構(gòu)。很多軟件都提供了對XML對象的支持。XML DOM文檔對象模型類是XML文檔的內(nèi)存中表示形式,DOM文檔對象模型能夠以編程方式讀取、處理和修改XML文檔。XML數(shù)據(jù)在內(nèi)存中表示是常見的結(jié)構(gòu)化方法,盡管實際的XML數(shù)據(jù)在文件中時或從另一個對象傳入時以線性方式存儲。
在XML文檔結(jié)構(gòu)中,XMLNode對象是DOM樹中的基本對象。通過將XML文件轉(zhuǎn)換成對象,能夠用程方式操作XML文檔。通過查找、學(xué)習(xí)相關(guān)資料發(fā)現(xiàn)Oracle有一個包XMLDOM,可以很方便的處理XML對象。
通過oracle的XMLDOM包解析出的數(shù)據(jù)直接插入數(shù)據(jù)表中。存儲過程運行于數(shù)據(jù)庫內(nèi)部,不需要再由程序?qū)?shù)據(jù)讀出來,所以減少了系統(tǒng)資源占用。在實際使用過程中發(fā)現(xiàn)數(shù)據(jù)庫的執(zhí)行效率非常高,解析時間在毫秒級,CPU占用率也極低。
解決了XML數(shù)據(jù)解析問題后還存在一個問題,就是收到MES新數(shù)據(jù)后的觸發(fā)處理,這是解決通信數(shù)據(jù)處理及時性的關(guān)鍵。采用定時器掃描處理的方式有先天的弊端,并不適合對速度要求較高的環(huán)境。通過比較認為采用觸發(fā)器比較適用于及時處理通信數(shù)據(jù)。觸發(fā)器在數(shù)據(jù)庫以獨立的對象存儲,觸發(fā)器不需要顯示調(diào)用而是由一個事件啟動運行。
這樣當(dāng)MES有新數(shù)據(jù)存入本地接口表時,在插入新數(shù)據(jù)前就會觸發(fā)解析新數(shù)據(jù)的存儲過程。存儲過程會把解析好的數(shù)據(jù)保存到相應(yīng)的表。MES發(fā)送的原始數(shù)據(jù)也插入本地接口表存檔。使用觸發(fā)器觸發(fā)新數(shù)據(jù)處理,免去了定時器對某個表的頻繁讀取,減輕了對數(shù)據(jù)庫的沖擊,能夠提高整個數(shù)據(jù)運行效率。數(shù)據(jù)庫解析過程對于上層程序來說是透明的,上層進程不需要知道數(shù)據(jù)來源,只需使用即可。
向MES發(fā)送的數(shù)據(jù)采用類似的處理方式,不用后臺進程處理,直接由oracle數(shù)據(jù)庫進行封裝,然后發(fā)送到MES的接口表。oracle對數(shù)據(jù)的封裝調(diào)用了oracle的DBMS_XML包,這個包能夠把SQL查詢的結(jié)果轉(zhuǎn)換成XML文件。最后將生成的XML文檔放入clob字段并發(fā)送給MES。封裝XML的過程重點是根據(jù)報文結(jié)構(gòu)構(gòu)造查詢結(jié)果集,查詢結(jié)果集要和生成的XML數(shù)據(jù)結(jié)構(gòu)一致,否則會生成錯誤的XML文件。
經(jīng)過后期的應(yīng)用測試,去掉后臺處理程序后縮短了數(shù)據(jù)處理流程??s短數(shù)據(jù)流程后數(shù)據(jù)處理速度更加迅速,滿足了生產(chǎn)的實時性要求。新數(shù)據(jù)通過觸發(fā)的方式處理速度更加迅速,同時降低了服務(wù)器的資源占用。并且通過數(shù)據(jù)庫解析、封裝XML通信數(shù)據(jù),使數(shù)據(jù)與應(yīng)用程序的分層更加清晰。數(shù)據(jù)的問題全部交由數(shù)據(jù)庫處理,數(shù)據(jù)庫不僅是“容器”還作為“處理器”。前臺應(yīng)用程序只需調(diào)用現(xiàn)成處理好的數(shù)據(jù)。也為以后大項目的分工協(xié)作提供了新的方法。