肖招娣
(廣東電網有限責任公司 佛山供電局,廣東 佛山 528000)
目前公司內部基于B/S架構的信息系統所具備的數據收集功能均為基于固定庫表結構的。這存在5個問題:1)需要重復開發多個不同的模塊,而這些模塊的代碼會存在高度的冗余和重復,實際上做了大量重復性的工作,浪費了軟件開發的人力資源。2)靈活性很差,無法滿足企業日常運作所需的不同表格的在線數據收集需求,迫使員工通過電子郵件等線下方式進行收集、下載和人工合并,浪費了大量的勞動力。3)對于復雜的表格,人工合并過程容易出錯。4)沒有集中存放,人員換崗或者離職后,容易造成數據丟失,不便于查詢歷史數據和追溯。5)沒有備份,一旦數據收集者個人電腦硬件出現不可恢復的故障,收集者需要重新匯總數據。
本文研發的基于動態表格格式的數據上報平臺,用戶可以自身的需要定制數據庫表結構,線上發布數據收集模板,通過平臺上報數據自動匯總數據。基于動態表格格式,極大地增強了它的靈活性,擴大了它的應用范圍。
該平臺采用基于Struts 2的MVC架構。用戶通過JSP/html發起請求,通過struts 2的配置文件,調用對應的Action,并將結果反饋給JSP/html進行展示[3-4]。
使用MVC架構,踐行“高內聚、低耦合”的原則,使得該平臺具有良好的可擴展性,易于維護和修改,提高代碼的重復利用率,降低代碼冗余度。
系統功能架構圖如圖3所示。

圖1 基于Struts 2的MVC業務處理流程Fig.1 MVCbusiness process based on Struts 2

圖2 系統整體架構Fig.2 The overall system architecture

圖3 系統功能架構圖Fig.3 Function architecture of the system
目前,處理excel讀寫的開源 API包括 Jxl和 POI[1]。Jxl(Java Excel API)只支持Excel 2003以下的版本,POI可支持更高的Excel版本2007。通常情況下只是使用POI的用戶模式進行Excel的讀取,這種方式同Jxl的使用很類似,使用簡單,都是將文件一次性讀到內存,文件小的時候,沒有什么問題,當文件大的時候,就會出現內存溢出問題。該平臺對excel 2007進行處理的時候,采用POI的事件驅動模式.拿Excel 2007來說,其內容采用XML的格式來存儲,所以處理Excel就是解析XML,使用事件驅動模式解析讀取XML文檔時,并沒有將整個文檔讀入內存,而是按順序將整個文檔解析完,在解析過程中,會主動產生事件交給程序中相應的處理函數來處理當前內容。因此這種方式對系統資源要求不高,可以處理海量數據。因此,該平臺初步具備了處理海量數據的基礎。
動態表格設計,意味著表格中包含的數據的列數以及每一列的屬性是變化的。常規的Excel數據導入到數據庫中的方法是針對固定的表格設置進行的,這種情形只要對每一列的數據結合其類型處理即可。為了避免動態表格格式的數據上報過程數據導入數據庫時類型不匹配的問題,以及復雜的類型處理邏輯,該平臺采用了中間文件類型的方法解決該問題,即先將Excel數據讀取出來,寫入到不帶格式的文件中,再通過命令將中間文件中的數據導入到目標數據庫中。
根據該平臺的設計,需要定義一個模板發布格式,由用戶填寫完后在平臺上發布,發布過程在后臺的操作即創建數據庫表并定義其結構,這就存在中文字符串長度定義問題,最理想的狀態是正好夠用而又不浪費資源。該平臺采用的是UTF-8的編碼方式,即一個中文字符占3個字節[2]。解決這個問題的方法是,由模板發布者估算對應列包含中文字符的最大長度,而后通過相關的轉換確定每個字符串型的字段的長度。
由于該平臺的數據上報均是以部門為單位進行的,因此沒有必要采用面向用戶的權限控制顆粒度。在滿足基本需求的情況下,為加速開發進度,對平臺數據修改、模板修改過程中權限的控制采用的方式是比對當前用戶和對應數據、模板的上傳者的用戶名、MAC地址信息等,當二者一致的時候,予以修改。
以往在開發簡單的web應用時,考慮到業務邏輯不復雜,一般情況下使用servlet充當控制器,這種方法的弊端是代碼量比較大,數據從jsp/html傳遞到控制器以及網頁的跳轉,均需要通過代碼實現。為簡化開發過程,該平臺使用了Struts 2充當控制器,通過簡單的配置文件[5-6],實現業務邏輯控制,大大簡化了實現過程。
企業日常運作過程中需要收集大量的數據,為了解決線下數據上報存在的問題,研發了基于動態表格格式的數據上報平臺。該平臺:
1)對不同版本的Excel文件分而治之。使用了jxl和POI開源的Java API源碼庫,分別解決了Excel 2003和Excel 2007的讀寫問題。
2)引入POI事件驅動模式對Excel文件進行處理,使得該平臺具備了海量數據處理的基礎。
3)解決了動態數據庫結構數據導入問題。由于數據導入過程中,由于各類表格的列數及每一列的屬性相差甚遠,無法通過固定的方式處理。該平臺使用了具備了動態數據庫表結構自適應能力。
4)通過中間文件,避免了數據批量導入過程中復雜的數據處理邏輯。
[1]POI讀取海量數據[EB/OL]http://blog.csdn.net/jinshuaiwang/article/details/15499685.
[2]Java中文字符所占的字節數[EB/OL]http://www.blogjava.net/qileilove/archive/2014/02/26/410319.html.
[3]struts2處理請求的過程分析[EB/OL]http://www.2cto.com/kf/201312/262962.html.
[4]struts2——基礎流程[EB/OL]http://www.cnblogs.com/jacksun 1978/archive/2012/06/29/2570087.html.
[5]王偉平,等.Struts 2完全學習手冊[M].北京:清華大學出版社,2011.
[6]陳亞輝,繆勇.Struts2+Spring+Hibernate框架技術與項目實戰[M].北京:清華大學出版社,2012.