一种基于源码分析和代码生成的ORM开发工具

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:sakurabb1
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:目前在开发信息系统时,数据持久化功能多采用ORM(对象——关系映射)框架,如Hiberate、MyBatis来进行。这类框架降低了数据持久化功能开发工作量,提升了软件开发和维护的效率,但同时也降低了系统的运行速度、消耗了更多的内存等资源。针对现有ORM框架运行效率低的缺点,该文提出了一种在代码开发阶段使用源码分析获取ORM元信息,自动生成相关代码的数据持久化功能开发方法,并以Intelli IDEA平台插件的形式设计和开发了相应的工具——EasyPersist 。本文通过实验程序,将自动生成的持久化代码与使用Hibernate框架的代码进行了对比实验,证明了所提出的方法的有效性。
  关键词:数据持久化;ORM;源码分析;代码生成
  中图分类号:TP317 文献标识码:A 文章编号:1009-3044(2016)20-0083-04
  1 背景
  黑龙江省森林工业总局(龙江森工)是我国最大的国有林区和森林工业集团。龙江森工为了提升自身的管理水平,委托笔者所在的课题组开发和实施智慧林业信息管理平台项目。笔者在项目的调研过程中了解到,基层职工多,包袱重,人均收入低,信息化投入有限,是影响国有林业企业基层信息管理系统普及的重要因素。因此,尽可能地提高信息系统的运行效率,降低系统对运行环境的要求,减少系统运维成本,对于在林业部门普及和推广信息系统具有重要的意义。
  为了应对问题领域的复杂性,较好地适应需求的变化,目前的信息系统大多采用面向对象方法进行开发,用实体对象[1]来组织和表示系统在运行过程中获取和产生的各种信息。而与此同时,在信息的持久化存储上,大多数信息系统还在采用传统的关系式数据库,即使用关系数据表来存储信息。因此,在大多数信息系统中,都必须通过某种方式来实现从对象和关系式数据的转换,即所谓的对象——关系映射(Object-Relational Mapping,简称ORM)功能[2-4]。
  目前有多种ORM框架,如Hiberante[5]、iBatis[6]等,可以帮助开发者简化ORM功能的开发。这些ORM框架都是在程序运行时,通过反射来动态访问实体对象的属性和方法[7, 8],不需要对象实现特殊的接口或方法,具有较高的灵活性,易于部署和使用,因此得到了广泛的应用。
  但这些ORM框架也存在一些天然的缺陷,如:1)必须使用反射机制动态访问实体对象,增加了系统运行时的开销,降低了系统的运行效率;2)数据库操作完全在程序运行时动态生成,开发人员难以控制和优化[9-12]等。
  针对传统ORM框架运行效率较低的缺点,本文提出了一种新的在代码开发阶段,自动生成源代码的ORM开发方法,并在Intellij IDEA平台①上设计和实现了相应的ORM开发工具——EasyPersist②。使用该工具,可以自动生成实体类的ORM持久化代码。生成的代码可供开发人员利用继承或嵌入等方式直接使用,也可以自由的进行修改和优化。因此本方法在未牺牲开发效率的前提下,为开发人员提供了更大的灵活性。此外,由于没有运行时的反射等开销,最终程序的代码运行效率也更高。该工具在实际项目《龙江森工集团智慧决策平台》的开发中得到了应用,取得了较好的效果。
  2 问题描述
  2.1 ORM功能
  在使用面向对象方法开发的系统中,实体对象(Entity)是数据的基本组织和存储单位,数据多以实体对象属性的形式存在。当系统需要将实体对象中的数据持久化保存到数据库中时,必须将实体对象的属性值转化成对应的数据记录的字段参数;同样的,当系统需要从数据库中载入数据时,也必须将数据库返回的查询结果中的字段数据转化为对应的实体对象属性,如表1所示。这就是所谓的ORM功能。
  由于ORM本质上是对数据库访问接口的机械调用和数据格式之间的转换,因此可以用某种自动化工具来对其进行封装,从而简化系统的开发。根据这一思想,产生了ORM框架。使用ORM框架开发的系统,无须编写数据库访问和数据映射转换代码,只需要将转换信息(ORM元信息)提供给ORM框架,然后调用相关的API即可。除此之外,很多ORM框架还提供了实体间关系映射的处理、缓存等高级功能。
  但这些框架都需要在系统运行时,动态生成SQL查询语句,并通过反射等方式动态创建和访问实体对象,因此需要额外消耗一定的内存和CPU等资源,与手工编写的ORM相比,运行效率较低;此外,由于SQL语句在运行时动态生成,难以对其进行手动优化,因此这类框架也普遍存在着复杂查询效率低的问题。
  2.2 ORM元数据与注解
  ORM主要是实体对象(属性)和关系数据(字段)之间的转换,不管哪种ORM工具,都需要知道实体和数据表、属性和字段等之间的对应关系,才能完成转换。这些对应信息就构成了所谓的ORM元信息(meta information)。目前,主要有三种方法来提供ORM元信息,即约定[13]、XML映射文件和注解[14, 15]。
  约定方式是指程序开发者按照预先约定好的规则来命名相关的程序和数据库元素,如要求实体类和数据表的名称必须相同等。这种方法工作量较小,但灵活性和兼容性差,主要用在各种快速开发框架中;XML映射文件方式是指以XML格式的配置文件提供相关的ORM元信息,使用较为灵活,但配置信息和程序代码分离也带来了一些开发维护上的问题;注解方式是通过特殊的语法,将元数据直接以注解(Annotation)的形式嵌入在程序源代码和编译后的可执行代码中,开发、维护和使用较为便利,目前也得到了广泛的应用。本文也采用这种方法来提供实体类的ORM元信息。表2是采用JPA 2.1标准注解提供ORM元信息的实体类示例:
  3 工作原理
  目前各种ORM框架,如Java社区常用的Hibernate,MyBatis等,其基本工作原理类似,如图1所示:   1)系统启动时,首先通过读取XML文件、解析代码中的注解信息等方式载入ORM元信息;2)当系统需要进行数据持久化时,调用ORM框架提供的API接口方法;3)ORM框架一方面通过反射机制访问实体对象中的相应属性或方法,从而实现对象中信息的读取或更新;另一方面根据元信息动态生成SQL语句,访问关系式数据库进行数据存取。
  为了解决ORM框架在运行时工作带来的运行效率低下的问题,本文提出的EasyPersist工具,其工作原理与传统的ORM有较大的区别,如图2所示:
  1)EasyPersist工作在代码开发阶段。开发人员完成了实体类和ORM元信息的开发后,手动执行EasyPersist工具;
  2)EasyPersist工具读入实体类的源代码,分析其注解信息,从而得到ORM元信息,建立ORM映射模型;
  3)EasyPersist根据ORM映射模型,生成实体类对应的数据持久化源代码(以数据持久化类的形式);
  4)开发人员在程序中使用自动生成的源代码。
  由于EasyPersist自动化生成相关的源代码,因此其开发的效率与使用ORM框架相比,是相同的;同时,由于生成的源代码中未对数据库操作和数据库转换操作进行额外的封装,因此它的执行效率与手工编写的代码相当,比传统的ORM框架要更加高效。
  4 EasyPersist工具设计与实现
  4.1 EasyPersist的整体结构
  EasyPersist的整体结构如图3所示,主要包括四大子模块,即:
  1)XML配置文件解析模块(Config Parser),负责解析XML配置文件,获取实体类所在包和持久化代码输出目录等相关配置信息;
  2)实体关系模型仓库(Mapping Repository),用于储存各实体类对应的ORM元信息;
  3)源代码分析模块(Package Scaner),用于分析实体类的源代码,获取实体类对应的ORM的元信息,并存储到实体关系模型仓库中;
  4)代码生成模块(Persistor Generator),从实体关系模型仓库中读取各实体的ORM元信息,生成最终的持久化代码。
  4.2 源代码分析算法
  源代码分析模块是EasyPersist的核心模块之一,其作用是对程序源代码进行分析,找出实体类以及对应的ORM元信息。其核心算法如表3所示:
  4.3 代码生成算法
  代码生成是EasyPersist的另一个核心模块,其作用是根据已有的ORM元信息,生成对应实体的持久化代码。其核心算法见表4。
  4.4 条件查询与分页
  除了基本的CRUD操作外,在信息系统中还经常需要查找属性符合特定条件的实体,即进行条件查询操作。由于每一个实体类都可能会有多个属性,将各属性的所有可能组合都一一列举出来分别生成一个对应的查询方法,会导致生成的代码过分庞大。因此,需要通过某种方式,在ORM元信息中指明可能的条件查询方式。
  实际上,在关系数据库的查询中,往往采用建立索引的方式来对条件查询进行优化。因此,可以在实体类代码中嵌入JPA2.1标准中的@Index和@UniqueContstraint等注解,以提供数据库中的索引信息,如表5所示。
  EasyPersist在源代码分析时读取这些元信息,然后在代码生成根据元信息推断出信息系统可能的条件查询方式,并生成相应的条件查询代码。
  根据索引和被索引字段类型的不同,其可能的条件查询方式和返回结果也不同:
  1)对于唯一型索引,其可以有两种查询方式:a.要求被索引字段(属性)的值与查询关键字相等,此时查询结果应是唯一的;b.要求被索引字段(属性)的值位于查询关键字限定的某个范围内,此时查询结果是一组实体对象。因此,对于此种索引,可以针对两种情况分别生成两个查询方法。
  2)对于非唯一型索引,不管是要求与查询关键字相等还是要求位于某一范围内,其查询结果都可能是一组实体对象。因此。这种索引只需要生成一个查询方法。
  此外,针对信息系统中常见的分页要求,EasyPersist一方面在返回一组对象的查询方法中增加了相关的参数,另一方面为每个索引生成一个对应的计数方法。
  最终得到的条件查询方法生成算法如表6所示。
  5 试验
  笔者在Core i5,16G内存,Windows 7 64位, JDK 1.8.0_60 64位环境下,对使用Hibernate框架编写和用EasyPersist生成的持久化代码进行了对比测试。具体测试内容如下:
  1)实验一,将1000个实体对象依次保存到空的数据表中,记录所用总时间和内存;
  2)实验二,从数据表中读取全部的1000条记录,重复1000次,记录所用总时间和内存;
  3)实验三,从数据表中读取所有符合特定查询条件的记录(有索引),重复1000次,记录所用总时间和内存。
  三项实验分别进行了1000次,结果如表7-9所示
  从实验结果可见,与Hibernate框架相比,使用EasyPersist生成的持久化代码,其运行时间更短,使用的内存资源也更少;特别是进行数据的读取查询处理时,在内存资源的使用上有近百倍的差别。因此,EasyPersist具有明显的优越性。
  6 结束语
  本文针对以Hibernate为代表的 ORM框架的运行时速度较慢,资源占用较高等缺点,提出了一种在代码开发时通过源码分析提取ORM元信息,从而自动生成数据持久化源代码的ORM开发方法,并开发出了相应的EasyPersist工具。实验证明,使用该工具生成的数据持久化代码,与使用传统ORM框架开发的数据持久化代码相比,开发和维护效率相当,而在运行速度和内存占用上都有较明显的改善,从而可以减少系统对运行环境的要求,更加有利于信息系统在基层林业部门的普及和推广。   注释:
  ① http://www.jetbrains.com/idea.
  ② https://github.com/royqh1979/EasyPersist.
  参考文献:
  [1] Masliankoa P P, Maistrenkoa A S. A system of entities for enterprise business models[J]. Cybernetics and Systems Analysis, 2012, 48(1): 99-107.
  [2] Wang Y, Xu,Y. Research of solutions of object-relational mapping in JAVA platform[C]//2011 International Conference on Control, Automation and Systems Engineering, Singapore, Singapore, 2011.
  [3] Zyl P V, Kourie D G.The influence of optimisations on the performance of an object relational mapping tool[C]//Proceedings of the 2009 Annual Research Conference of the South African Institute of Computer Scientists and Information Technologists, Vanderbijlpark, Emfuleni, South Africa. ACM, 2009.
  [4] 李杰. 基于ORM的轻量级数据持久化技术研究及应用[J]. 计算机科学, 2010, 37(9): 190-193, 208.
  [5] O’Neil E. Object/Relational mapping 2008: Hibernate and the entity data model (EDM)[C]//2008 ACM SIGMOD International Conference on Management of Data, Vancouver, BC, Canada. 2008.
  [6] 程文波, 卢涵宇. 一种新的数据持久层设计方法与实现[J]. 微电子学与计算机, 2011(7): 28-30.
  [7] Gotz S, Kuhn T. Models@run.time for object-relational mapping supporting schema evolution[C]//10th International Workshop on Models@run.time, MRT 2015 - co-located with the 18th International Conference on Model Driven Engineering Languages and Systems, MoDELS 2015, September 29, 2015, Ottawa, ON, Canada. CEUR-WS, 2015.
  [8] Kurtev I. Application of reflection in a model transformation language[J]. Software
其他文献
摘要:2012年,随着甘肃全省广电网络的整合,高清、互动视频点播、宽带数据以及集团专线业务的拓展在全省范围内逐步展开,由于业务量的不断增大,原省干传输网络采用华为2.5G SDH系统在带宽上已开始出现瓶颈,为确保省广电网络公司与各市州分公司业务的互联互通,建设一张大容量、多业务、高可靠,能够满足当前和未来业务发展需求,并基于现有光缆线路的新一代省干光传输网迫在眉睫。在此背景下,甘肃省广电网络公司按
重庆育才中学,重庆市九龙坡区400050    一、选择题:(每小题只有一个正确选项,每小题3分,共21分)  1.如图1所示,人沿水平方向拉牛,但没有拉动。其中说法正确的是(  ) 。  A.绳拉牛的力与牛拉绳的力是一对平衡力。  B.绳拉牛的力与地面对牛的摩擦力是一对平衡力。  C.绳拉牛的力小于牛拉绳的力。  D.绳拉牛的力小于地面对牛的摩擦力。  2.日常生活中,我们经常需要搬运大小轻重
摘要:对于不同电荷体系电势能的大小是否具有可比性,本文从一个具体问题进行探讨,并说明物理概念教学在新课程理念指导下的重要性。  关键词电势能;参考点;概念教学  中图分类号:G633.7文献标识码:A文章编号:1003-6148(2007)2(S)-0022-2    1问题的由来:      在课堂教学中,为了拓展电势能和电势的理解,我出了一道问答题:“在正电荷形成的电场中的某一点,正试探电荷所
摘要:通过对各种类型的计算机硬盘保护卡的反复实验比对,确定保护卡软件存放在计算机中的位置,结合对联想慧盾保护系统程序进行具体分析,得出联想慧盾保护系统程序在计算机硬盘中的位置,并利用联想慧盾保护系统的“保护系统参数”传送功能、MHDD专业硬盘工具软件复制硬盘扇区数据、VB编写硬盘扇区写入程序等方法,复制联想慧盾保护系统在计算机硬盘中的程序,解决联想计算机更换硬盘后,保留联想慧盾保护系统的功能。  
摘要:教材是实施课堂教学的重要资源,教师要以新课程的理念创造性地使用它。人教社的物理教材八年级(上)第二章的第四节“光的折射”,集物理现象、物理概念、物理规律、知识应用于一体,对本章的学习乃至初中物理光学部分都有至关重要的作用。为了更好地达到课程标准提出的的三维课程目标,最好是把“光的折射”设计成为一堂科学探究课。  关键词创造性;科学探究;光的折射  中图分类号:G633.7  文献标识码:A 
摘要:该文以《计算机应用基础》7.2节加工处理图形图像的第二节课“PhotoShop图层”的教学为例,通过故事教学为主线,结合任务驱动法和计算机操作课的特点,从教学设计的主导思想、任务案例的选取原则、教学环节的创新手段等方面,探讨了计算机教学的创新方式方法。  关键词:图层;故事教学法;任务驱动;情境教学;创新  中图分类号:G424 文献标识码:A 文章编号:1009-3044(2014)34-
摘要:针对仅仅依靠模式识别的监控系统存在难以确定判定事件发生时间点的问题,引入射频身份识别(RFID)技术,讨论了一种融入RFID时间戳的分布式智能视觉监控系统。应用XML消息-代理机制屏幕前端设备差异,通过时间戳进行精确视频探测,对目标进行监视控制和信息记录,提高仓储管理的自动化,智能化。  关键词:智能视觉监控;RFID;分布式;存储管理  中图分类号:TP391 文献标识码:A 文章编号:1
摘要:一个没有经过仔细设计、部署和维护的WLAN网络,其整体性能将会大打折扣,因此发现和解决干扰一直是伴随WLAN发展的任务之一。今天,WLAN已经不再仅仅是最初的一种简便的网络接入方式,企业的许多重要应用,诸如语音、视频、定位等服务都逐渐部署到无线网络上。即便是普通的网络访问,用户也是希望带宽越高越好。随着应用的增加,无线干扰问题对网络服务的质量影响日显突出。  关键词:WLAN;无线干扰;避免
摘要:教师头脑中储备的专业知识,是一种生命载体课程资源,它存之有效、取之便捷且与身俱在。中学物理教师可以在语言文学、教学案例、典型习题、物理实验、故事素材等方面有意识地加以收集储备。  关键词:生命载体;课程资源;头脑储备  中图分类号:G633.7 文献标识码:A 文章编号:1003-6148(2007)12(S)-0008-3    成熟教师与职初教师的区别主要在于教学经验的有无和与教师专业有
摘要:高职院校图书馆在数字资源上的建设投入在逐年增加,但投入跟产出不能成正比。由此带来的对该如何有效率的建设高职数字资源的研究也越来越具有实际意义。该文通过从2005年至今学院数字图书馆建设的历年数据的分析,归纳了影响高职数字资源建设的一系列因子,并分列出15个正向主要影响因子和4个反向主要影响因子,提出了网络建设、资源和服务的充分是数字图书馆建设的主要影响因子,最后建议面向这些影响因子有针对性地