




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档2016全新精品资料全新公文范文全程指导写作独家原创1/11J2EE应用下基于AOP的抓取策略如何通过最精简的SQL查询获取所需的数据。很多时候这可不是轻而易举的事情。默认情况下,O/RMAPPING工具会按需加载数据,除非你改变了其默认设置。延迟加载行为保证了依赖的数据只有在真正请求时才会被加载进来,这样就可以避免创建无谓的对象。有时我们的业务并不会使用到依赖的那些组件,这时延迟加载就派上用场了,同时也无需加载那些用不上的组件了。典型情况下,我们的业务很清楚需要哪些数据。但由于使用了延迟加载,在执行大量SELECT查询时数据库的性能会降低,因为业务所需的数据并不是一下子获得的。这样,对于那些需要支持大量请求的应用来说可能会产生瓶颈可伸缩性问题。来看个例子吧,假设某个业务流程想要得到一个PERSON及其ADDRESS信息。我们将ADDRESS组件配置成延迟加载,这样要想得到所需的数据就需要更多的SQL查询,也就是说首先查询PERSON,然后再查询ADDRESS。这增加了数据库与应用之间的通信成本。解决办法就是在一个单独的查询中将PERSON和ADDRESS都得到,因为我们知道这两个组件都是业务流程所需的。如果在DAO/REPOSITORY及底层SERVICE开发特定于业务的FETCHINGAPI,对于那些拥有不同数据集的相同领域对象来说,我们就得编写不同的API进行抓取并组装了。这么精品文档2016全新精品资料全新公文范文全程指导写作独家原创2/11做会使REPOSITORY及底层SERVICE过于膨胀,最终变成维护的梦魇。延迟抓取的另一个问题就是在获取到请求的数据前要一直打开数据库连接,否则应用就会抛出一个延迟加载异常。说明如果在查询中使用预先抓取来获取二级缓存中的数据时,我们将无法解决上面提出的问题。对于HIBERNATE来说,如果我们使用预先抓取来获取二级缓存中的数据,那么它将从数据库而不是缓存中去获取数据,哪怕是二级缓存中已经存在该数据。这就说明HIBERNATE也没有解决这个问题,从而表明我们不应该在查询中通过预先抓取来获得二级缓存中的对象。对于那些可以让我们调节查询以获取缓存对象的O/RMAPPING工具来说,如果缓存中有对象就会从缓存中获取,否则采取预先抓取的方式。这就解决了上面提到的事务/DB连接问题,因为在查询的执行过程中会同时获取缓存中的数据而不是按需读取也就是延迟加载。通过下面的示例代码来了解一下延迟加载所面对的问题及解决办法。考虑如下场景某领域中有3个实体,分别是EMPLOYEE、DEPARTMENT及DEPENDENT。这三个实体之间的关系如下EMPLOYEE有0或多个DEPENDENTS。DEPARTMENT有0或多个EMPLOYEES。EMPLOYEE属于0或1个DEPARTMENT。精品文档2016全新精品资料全新公文范文全程指导写作独家原创3/11我们要执行三个操作获取EMPLOYEE的详细信息。获取EMPLOYEE及其DEPENDENT的详细信息。获取EMPLOYEE及其DEPARTMENT的详细信息。以上三个操作需要获取并呈现不同的数据。使用延迟加载有如下弊端如果对实体EMPLOYEE所关联的DEPENDENT和DEPARTMENT这两个实体使用延迟加载,那么在操作2和3中就会生成更多的SQL查询语句。在多个查询语句的执行过程中需要保持数据库连接,否则会抛出一个延迟加载异常,这将导致数据出现问题。但另一方面,使用预先抓取也存在如下弊端对EMPLOYEE所对应的DEPENDENTS和DEPARTMENT采取预先抓取会产生不必要的数据。无法在特定的场景下对查询进行调优。在REPOSITORY/DAO或底层服务中使用特定于操作的API可以解决上述问题,但却会导致如下问题代码膨胀不管是SERVICE还是REPOSITORY/DAO类都无法幸免。维护的梦魇不管是SERVICE还是REPOSITORY/DAO层,只要有新的操作都需要增加新的API。代码重复有时底层服务需要在获取的实体上增加某些业务逻辑,与之类似,还要在数据返回前检查DAO/REPOSITORY层的查询响应以验证数据可用性。精品文档2016全新精品资料全新公文范文全程指导写作独家原创4/11为了解决上面这些问题,REPOSITORY/DAO层需要根据不同的业务情况执行不同的查询来获取实体。就像ASPECT类所定义的那样,我们可以根据特定的操作使用不同的抓取机制来覆盖REPOSITORY/DAO类所定义的默认抓取模式。所有的抓取模式类都实现了相同的接口。J2EE应用下基于AOP的抓取策略J2EE应用下基于AOP的抓取策略REPOSITORY类使用了上述的抓取模式来执行查询,如下代码所示PUBLICEMPLOYEEFINDEMPLOYEEBYIDINTEMPLOYEEIDLISTEMPLOYEEHIBERNATETEMPLATEFINDFETCHINGSTRATEGYQUERYEMPLOYEEBYID,NEWINTEGEREMPLOYEEIDIFEMPLOYEESIZE0RETURNNULLRETURNEMPLOYEEEMPLOYEEGET0精品文档2016全新精品资料全新公文范文全程指导写作独家原创5/11REPOSITORY类中的EMPLOYEE的抓取策略需要根据实际情况进行调整。我们决定将REPOSITORY层的抓取策略调整到REPOSITORY和SERVICE层外,放在一个ASPECT类中,这样当需要增加新的业务逻辑时只需修改ASPECT类并增加一个针对于REPOSITORY的抓取策略实现即可。这里我们使用了面向方面的编程ASPECTORIENTEDPROGRAMMING以根据业务的不同使用不同的抓取策略。什么是面向方面的编程面向方面的编程AOP可以通过模块化的形式实现实际应用中的横切关注点,如日志、追踪、动态分析、错误处理、服务水平协议、策略增强、池化、缓存、并发控制、安全、事务管理以及业务规则等等。对这些关注点的传统实现方式需要我们将这些实现融合到模块的核心关注点中。凭借AOP,我们可以在一个叫做方面ASPECT的独立模块中实现这些关注点。模块化的结果就是设计简化、易于理解、质量提升、开发时间降低以及对系统需求变更的快速响应。接下来读者朋友们可以参考RAMNIVASLADDAD所著的ASPECTJINACTION一书以详细了解ASPECTJ的概念以及编程方式,还可以了解一下ASPECTJ的开发工具。ASPECT在抓取策略实现上扮演着重要角色。抓取策略是个业务层的横切关注点,它会随着业务的变化而变化。ASPECT对于特定的业务逻辑下使用何种抓取策略起到了至关重要的作用。这里我们将对抓取策略的管理放在了底层精品文档2016全新精品资料全新公文范文全程指导写作独家原创6/11服务和RESPOSITORY层之外。任何新的业务都可能需要不同的抓取策略,这样我们就无需修改底层服务或是RESPOSITORY层的API就能应用新的抓取策略了。FETCHINGSTRATEGYASPECTAJ/IDENTIFYTHEGETEMPLOYEEWITHDEPARTMENTDETAILSFLOWWHEREYOUNEEDTOCHANGETHEFETCHINGSTRATEGYATREPOSITORYLEVEL/POINTCUTEMPWITHDEPARTMENTDETAILCALLEMPLOYEEREPOSITORYFINDEMPLOYEEBYIDINTJ2EE应用下基于AOP的抓取策略文章J2EE应用下基于AOP的抓取策略出自HTTP/WWWGKSTKCOM/ARTICLE/WK78500001155879HTML,转载请保留此链接/WHENYOUAREATTHESPECIFIEDPOINCUTBEFORECONTINUINGFURTHERUPDATETHEFETCHINGSTRATEGYINEMPLOYEEREPOSITORYIMPLTOEMPLOYEEWITHDEPARTMENTFETCHINGSTRATEGY精品文档2016全新精品资料全新公文范文全程指导写作独家原创7/11/BEFOREEMPLOYEEREPOSITORYIMPLREMPWITHDEPARTMENTDETAIL/IDENTIFYTHEGETEMPLOYEEWITHDEPENDENTDETAILSFLOWWHEREYOUNEEDTOCHANGETHEFETCHINGSTARATERGYATREPOSITORYLEVEL/POINTCUTEMPWITHDEPENDENTDETAILCALLEMPLOYEEREPOSITORYFINDEMPLOYEEBYIDINT/WHENYOUAREATTHESPECIFIEDPOINCUTBEFORECONTINUINGFURTHERUPDATETHEFETCHINGSTRATEGYINEMPLOYEEREPOSITORYIMPLTOEMPLOYEEWITHDEPENDENTFETCHINGSTRATEGY/精品文档2016全新精品资料全新公文范文全程指导写作独家原创8/11BEFOREEMPLOYEEREPOSITORYIMPLREMPWITHDEPENDENTDETAILJ2EE应用下基于AOP的抓取策略J2EE培训这样,REPOSITORY到底要执行何种查询就不是由SERVICE和REPOSITORY层所决定了,而是由外面的ASPECT决定,纵使增加了新的业务也无需修改底层服务和REPOSITORY层。决定执行何种查询的逻辑就成为一个横切关注点了,它被放在ASPECT中。ASPECT会根据业务规则的不同在SERVICE层调用REPOSITORY层的API之前将抓取策略注入到REPOSITORY中。这样我们就可以使用相同的SERVICE和REPOSITORY层API来满足各种不同的业务规则了。来看个具体示例吧,该示例会同时抓取一个EMPLOYEE的DEPARTMENT和DEPENDENT的详细信息。我们需要对业务层进行一些变更,增加一个方法GETEMPLOYEEWITHDEPARTMENTANDDEPENDENTSDETAILSINTEMPLOYEEID。实现新的抓取策略类EMPLOYEEWITHDEPARTMENTANDDEPENDENTFETCHINGSTARATERGY,后者又实现了EMPLOYEEFETCHINGSTRATEGY并重写了QUERYEMPLOYEEBYID方法,该方法会返回优化后的查询,可精品文档2016全新精品资料全新公文范文全程指导写作独家原创9/11以在一个SQL语句中获取所需数据。由ASPECT将上述的抓取策略注入到相关的业务中,如下所示POINTCUTEMPWITHDEPENDENTANDDEPARTMENTDETAILCALLEMPLOYEEREPOSITORYFINDEMPLOYEEBYIDINTBEFOREEMPLOYEEREPOSITORYIMPLREMPWITHDEPENDENTANDDEPARTMENTDETAIL如你所见,我们并没有修改底层业务与REPOSITORY层而是使用ASPECT和一个新的FETCHINGSTRATEGY实现就完成了上述新增的业务。现在我们来谈谈关于二级缓存的查询优化问题。在上面的示例代码中,我们对DEPARTMENT实体进行一些修改并配置在二级缓存中。如果对DEPARTMENT实体采取预先抓取,那么对于同样的DEPARTMENT实例,纵使它位于二级缓存中,每次也都需要查询数据库。如果不在查询中获取DEPARTMENT实体,那么精品文档2016全新精品资料全新公文范文全程指导写作独家原创10/11业务层就需要参与到事务当中,因为我们并没有将DEPARTMENT实体缓存起来而是通过延迟加载的方式得到它。这样,事务声明就从底层移到了业务层,虽然我们知道该业务需要哪些数据,但O/RMAPPING工具却没有提供相应的机制来解决上面遇到的问题,即预先抓取缓存中的数据。对于那些没有缓存的数据来说这种方式没什么问题,但对于缓存数据来说,这就依赖于O/RMAPPING工具了,因为只有它才能解决缓存数据问题。该示例附带的源代码详细解释了抓取策略。该ZIP文件含有一个工程示例,阐述了上面谈到的所有场景。你可以使用任何IDE或是使用ASPECTJ编译器从命令行执行代码。在执行前请确保JDBCPROPERTIES文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理核心制度解读及案例
- 代运营合同范本 鉴于
- 劳务派遣合同范本2003
- 托管装修服务合同范本
- 清酒代理合同范本
- 工程设施购买合同范本
- 德邦加盟合同范本
- 拆迁分户合同范本
- 主力摄影合同范本
- 广告制作合同范本2017
- 2024年度软件即服务(SaaS)平台租赁合同3篇
- 网络攻防原理与技术 第3版 教案 -第12讲 网络防火墙
- 2024年新课标培训2022年小学英语新课标学习培训课件
- 2024小学语文教学及说课课件:二年级上册《田家四季歌》
- 2024至2030年中国聚脲涂料行业市场发展调研及投资前景分析报告
- 1.1 鸦片战争 课件 2024-2025学年统编版八年级历史上册
- 2024至2030年中国演播室行业市场调查研究及发展战略规划报告
- DB11∕T 420-2019 电梯安装、改造、重大修理和维护保养自检规则
- 国旗台施工合同
- 总代理授权书
- 医疗器械售后服务能力证明资料模板
评论
0/150
提交评论