肖招娣
(广东电网有限责任公司 佛山供电局,广东 佛山 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.