J2EE应用下基于AOP的抓取策略实现

使用了O/R Mapping工具的典型J2EE应用都会面临这样一个问题:如何通过最精简的SQL查询获取所需的数据。很多时候这可不是轻而易举的事情。默认情况下,O/R Mapping工具会按需加载数据,除非你改变了其默认设置。延迟加载行为保证了依赖的数据只有在真正请求时才会被加载进来,这样就可以避免创建无谓的对象。有时我们的业务并不会使用到依赖的那些组件,这时延迟加载就派上用场了,同时也无需加载那些用不上的组件了。

典型情况下,我们的业务很清楚需要哪些数据。但由于使用了延迟加载,在执行大量Select查询时数据库的性能会降低,因为业务所需的数据并不是一下子获得的。这样,对于那些需要支持大量请求的应用来说可能会产生瓶颈(可伸缩性问题)。

来看个例子吧,假设某个业务流程想要得到一个Person及其Address信息。我们将Address组件配置成延迟加载,这样要想得到所需的数据就需要更多的SQL查询,也就是说首先查询Person,然后再查询Address。这增加了数据库与应用之间的通信成本。解决办法就是在一个单独的查询中将 Person和Address都得到,因为我们知道这两个组件都是业务流程所需的。

如果在DAO/Repository及底层Service开发特定于业务的Fetching-API,对于那些拥有不同数据集的相同领域对象来说,我们就得编写不同的API进行抓取并组装了。这么做会使Repository及底层Service过于膨胀,最终变成维护的梦魇。

延迟抓取的另一个问题就是在获取到请求的数据前要一直打开数据库连接,否则应用就会抛出一个延迟加载异常。

说明:如果在查询中使用预先抓取来获取二级缓存中的数据时,我们将无法解决上面提出的问题。对于Hibernate来说,如果我们使用预先抓取来获取二级缓存中的数据,那么它将从数据库而不是缓存中去获取数据,哪怕是二级缓存中已经存在该数据。这就说明Hibernate也没有解决这个问题,从而表明我们不应该在查询中通过预先抓取来获得二级缓存中的对象。

对于那些可以让我们调节查询以获取缓存对象的O/R Mapping工具来说,如果缓存中有对象就会从缓存中获取,否则采取预先抓取的方式。这就解决了上面提到的事务/DB连接问题,因为在查询的执行过程中会同时获取缓存中的数据而不是按需读取(也就是延迟加载)。

通过下面的示例代码来了解一下延迟加载所面对的问题及解决办法。考虑如下场景:某领域中有3个实体,分别是Employee、Department及Dependent。

这三个实体之间的关系如下:

Employee有0或多个dependents。

Department有0或多个employees。

Employee属于0或1个department。


我们要执行三个操作:

获取employee的详细信息。

获取employee及其dependent的详细信息。

获取employee及其department的详细信息。

时间: 2024-10-29 22:30:41

J2EE应用下基于AOP的抓取策略实现的相关文章

lazy-hibernate 懒加载机制及抓取策略

问题描述 hibernate 懒加载机制及抓取策略 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.gycn.model.Hotel.roomTypes, no session or session was closed 出现这种情况是因为用了懒加载,但是有的地方需要加载集合,有的地方则不用,那么lazy这个属性到底要怎么设置呢? 解决方案 抓取策略应

基于JQuery的抓取博客园首页RSS的代码_jquery

效果图:实现代码: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http

jpa抓取策略详解fetch(lazy ,eager)

在jpa中jpa默认的加载方式是lazy方式也就是在实际使用到数据的时候才加 载相关数据,使用lazy时可以不用显示注明fetch=FetchType.LAZY 实体bean:carage Java代码 package com.hibernate.jpa.bean1; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Colu

百度站长平台lee:谈spider抓取过程中的策略

A5站长网8月22日消息,此前百度站长平台Lee曾分享过关于搜索引擎抓取系统中有关抓取系统基本框架.抓取中涉及的网络协议.抓取的基本过程的内容,今日Lee再次通过百度站长平台分享搜索引擎抓取系统第二部分内容-spider抓取过程中的策略. Lee表示spider在抓取过程中面对着复杂的网络环境,为了使系统可以抓取到尽可能多的有价值资源并保持系统及实际环境中页面的一致性同时不给网站体验造成压力,会设计多种复杂的抓取策略.并简单介绍了抓取过程中涉及到的主要策略类型. 在百度站长平台社区-你问lee答

玩玩小爬虫——抓取动态页面

       在ajax横行的年代,很多网页的内容都是动态加载的,而我们的小爬虫抓取的仅仅是web服务器返回给我们的html,这其中就 跳过了js加载的部分,也就是说爬虫抓取的网页是残缺的,不完整的,下面可以看下博客园首页 从首页加载中我们看到,在页面呈现后,还会有5个ajax异步请求,在默认的情况下,爬虫是抓取不到这些ajax生成的内容的, 这时候要想获取就必须调用浏览器的内核引擎来下载这些动态页面,目前内核引擎三足鼎立. Trident: 也就是IE内核,WebBrowser就是基于该内核,

伯克利AI实验室最新发文:公布用于机器人抓取的Dexterity Network (Dex-Net) 2.0数据集

雷锋网AI科技评论按:伯克利AI实验室最新发文公布了用于机器人抓取的Dexterity Network (Dex-Net) 2.0数据集,这些数据集可以用来训练根据实际机器人的点云做抓取规划的神经网络. 本文作者为加州大学伯克利分校博士后研究员Jeff Mahler.雷锋网(公众号:雷锋网)全文翻译如下: 由于传感器噪声和遮挡的存在,物体的形状.位置和质量往往不能被精准确定,因此让机器人能够可靠地抓取各种不同的物体是很大的一项挑战. Dexterity Network(Dex-Net)2.0是一

《用Python写网络爬虫》——2.2 三种网页抓取方法

2.2 三种网页抓取方法 现在我们已经了解了该网页的结构,下面将要介绍三种抓取其中数据的方法.首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块. 2.2.1 正则表达式 如果你对正则表达式还不熟悉,或是需要一些提示时,可以查阅https://docs.python.org/2/howto/regex.html 获得完整介绍. 当我们使用正则表达式抓取面积数据时,首先需要尝试匹配 元素中的内容,如下所示. >>> import re >>&

搜索引擎如何去抓取网页

搜索引擎看似简单的抓取-入库-查询工作,但其中各个环节暗含的算法却十分复杂.搜索引擎抓取页面工作靠蜘蛛(Spider)来完成,抓取动作很容易实现,但是抓取哪些页面,优先抓取哪些页面却需要算法来决定,下面介绍几个抓取算法: 1.宽度优先抓取策略: 我们都知道,大部分网站都是按照树状图来完成页面分布的,那么在一个树状图的链接结构中,哪些页面会被优先抓取呢?为什么要优先抓取这些页面呢?宽度优先抓取策略就是按照树状图结构,优先抓取同级链接,待同级链接抓取完成后,再抓取下一级链接.如下图:   大家可以发

PHP单线程实现并行抓取网页

  本PHP教程将模拟并行抓取多个页面信息的过程,关键在于单线程的并行处理. 一般情况下,大家写抓取多个页面信息的程序都采用串行方案,但获取周期过长,不实用.于是我想到用curl 去并行抓取.但是,最后发现,那个虚拟服务器上没有curl,这真是让人纠结.于是,我决定改变思路,用单个线程也实现多个线程的效果.我想对网络编程有点 了解的人肯定知道IO复用这个概念,当然PHP上也是支持的,而且,内部支持,不需要任何扩展. 可能有很多年编程经验的人对PHP的stream 函数可能不太了解.PHP的压缩文