网上购物系统中信息检索性能优化研究

来源 :商场现代化 | 被引量 : 0次 | 上传用户:kissface
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘要] 文中对Hibernate检索策略中内存浪费的原因进行了研究,提出了采用查询缓存和集合过滤的方法进行查询优化, 降低了访问数据库的频率且避免了在数据查询检索过程中加载不需要的Java对象,从而降低了的内存消耗。最后,通过查询网上购物系统中客户的定单记录试验验证了优化方式的有效性。
  [关键词] Hibernate 查询缓存 集合过滤 客户 定单
  
  在分层的软件架构中持久化层封装了所有数据访问细节,是对象-关系映射(ORM)的中间件,Hibernate是一种ORM中间件工具,它对JDBC API进行了封装,负责Java对象的持久化。Hibernate通过Session接口提供了基本的保存、更新、删除和查询,Session具有一个缓存,位于缓存中的对象处于持久化状态,它和数据库中的相关记录对应,Session能够在某些时间点按照缓存中持久化对象的属性变化来同步更新数据库。在Session的缓存中存放的是相互关联的对象图。在默认情况下,当Hibernate从数据库中加载Java对象时,会同时加载所有关联的Java对象,从而影响了系统的性能。本文以查询网上购物系统中的客户(Customer)和定单(Order)信息为例,介绍如何设置Hibernate的检索策略,以优化查询性能。
  一、常用查询方法
  设计两个数据库表, 表名为CUSTOMERS和ORDERS, 它们包含的基本字段及之间的关系如图1:
  Hibernate查询客户和定单信息的步骤为:
  1.运用反射机制,获得customer对象的类型Customer.class。
  2.参考对象-关系映射元数据,了解到和Customer类对应的表为CUSTOMERS表,类Customer与类Order关联,类Order和ORDERS表对应,ORDERS表中外键CUSTOMER_ID参照CUSTOMERS表的主键ID。
  3.根据映射信息,生成SQL语句:
  select *from CUSTOMERS;
  select *from ORDERS where CUSTOMERS_ID=1。
  4.调用JDBC API,执行以上SQL语句。Hibernate在检索与Customer关联的Order对象时,使用默认的立即检索策略。这种检索策略存在三大不足:
  (1)select语句的数目太多需要频繁地访问数据库,会影响检索性能。
  (2)在应用逻辑只需要访问Customer对象,而不需要访问Order对象的场合,加载Order对象完全是多余的操作,这些多余的Order对象浪费了许多内存空间。
  (3)假定这个Customer对象与500个Order对象关联,就会加载500个Order对象。在实际应用中往往只需要访问Orders集合中的部分Order对象.例如访问客户定单金额大于100的Order对象,此时调用customer.getOrders().iterator()方法会影响运行时性能.因为它会加载应用程序不需要访问的Order对象。
  延迟检索策略能避免多余加载应用程序不需要访问的关联对象;但当采用延迟检索策略时,应用程序如果希望访问游离状态的代理类实例,必须保证它作持久化状态时已经被初始化。迫切左外连接检索策略则利用SQL的外连接查询功能能够减少select语句的数目;但缺点在于可能会加载应用程序不需要访问的对象,浪费许多内存空间,更杂的数据库表连接也会影响检索性能。
  二、查询性能优化
  Hibernate主要可从以下两方面来优化查询性能。
  1.使用查询缓存降低访问数据库的频率,减少select语句的数目;对于经常使用的查询语句如果启用了查询缓存.当第一次执行查询语句时,Hibernate会把查询结果存放在第二级缓存中。以后再次执行该查询语句时.只需从缓存中获得查询结果从而提高查询性能。对查询语句启用查询缓存的步骤如下:
  (1)配置第二级缓存,在Customer.hbm.xml和 Order.hbm.xml映射文件中分别为Customer类、Customer类的orders集合以及Order类设置第二级缓存,
  Customer.hbm.xml设置第二级缓存代码:  name=“orders”
  >
  
  
  
  

  Order.hbm.xml设置第二级缓存代码:
  
  (2)在Hibernate的配置文件hibernate.properties中选用EHCache和设置查询缓存属性:
  hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvi
  Hibernate.cache.use_query_cache=ture
  (3)对于希望启用查询援存的查询语句.调用接口Query的setCacheable()方法:
  Query orderByMoneyQuery=session.createQuery(“from Order o where o.money>:money”);
  orderByMoneyQuery.setInteger(“money”, money);
  orderByMoneyQuery. setCacheable(true);
  如果希望更加精粒度地控制查询援存,可以设置缓存区域.
  orderByMoneyQuery.setCacheRegion(“orderQueries”);
  Hibernate提供了三种和查询相关的缓存区域
  ①默认的查询缓存区域:net.sf. hibernate.cache.StandardQueryCache
  ②用户自定义的查询缓存区域:如“orderQueries”
  ③时间戳缓存区域: net.sf. hibernate.cache.UpdateTimestampCache
  默认的查询缓存区域以及用户自定义的查询缓存区域部用于存放查询结果。而时间戳缓存区域存放了对与查询结果相关的表进行插入、更新或删除操作的时间戳。Hibernate通过时间戳缓存区域来判断被缓存的查询结果是否过期,它的运行过程如下:
  在T1时刻执行查询语句,把查询结果存放在QueryCache域.该区域的时间戳为TI时刻。
  在T2时刻对与查询结果相关的表进行插入、更新或删除操作。Hibernate把T2时刻存放在UpdateTimestampCache区域。
  在T3时刻执行查询语句前,先比较QueryCache区域的时间戳和UpdateTimestampCache区域的时间戳.如果T2>T1,那么就丢弃原先存放在QueryCache区域的查询结果,重新到数据库中查询数据再把查询结果存放在QueryCache区域;如果T2<T1,直接从QueryCache区域获得查询结果。
其他文献
受国际金融危机的影响,我国经济增速明显放缓。能否在复杂的环境下合理有效地调控人力资源是我国当前不容忽视的重要问题。本文主要分析金融海啸对广州就业的影响,并提出相应的
随着能源危机和环境污染等问题的出现和加剧,生态技术创新日益成为人类关注的焦点。本文通过论证生态技术创新的背景、传统生态技术创新的局限和我国生态技术创新的现状等几个
为了满足大跨径斜拉桥目标成桥状态,得到大跨径斜拉桥在施工过程中拉索的张拉力,提出了大跨径斜拉桥在施工过程中的拉索索力计算调整拉索无应力长度的降温法。倒退分析法和传
第五代移动通信技术(Fifth-Generation Mobile Communication System,5G)与长期演进技术(Long Term Evolution,LTE)建立通信的过程相似,都是以小区搜索作为用户设备接入无线网络与基站建立通信的第一步。因此,5G小区搜索的性能会影响到5G物理广播信道(Physical Broadcast Channel,PBCH)的性能,更会影响后续的通
经济布局是区域经济持续、健康发展的必要条件之一,对区域的发展具有非常显著的影响。本文根据经济布局评价的四个原则选取了四个评价指标,对山东省的总体经济布局进行了预测评
机械的使用存在着有形和无形的磨损,正确的机械的维修及保养能够有效地保持机械使用性能和延长使用寿命。机械维修中常存在对机械维修养护的重视性欠足、对机械设备技术改造的
“孙中山与南京临时政府史料展”系南京中国近代史遗址博物馆(总统府)与中国第二历史档案馆(二史馆)为迎接辛亥革命百年纪念共同承办的重要基本陈列之一,开展后广受关注和好评。现
从事技工教育多年,深切感到单片机基础知识的重要性。故从制冷专业应用实际出发,结合单片机课程教学的内容,提出了基于MCS-51温度计的设计实习。本文针对技工学校学生单片机
在某些工程中因工艺或已有设备的限制,将脱硫塔的烟箱出烟口做成双大开口。在自重、负压及积灰等荷载作用下烟箱会产生较大变形,危害结构的稳定性。借助Midas软件对某带双大