`
ch_space
  • 浏览: 111291 次
  • 性别: Icon_minigender_1
  • 来自: 农村进城务工人员
社区版块
存档分类
最新评论

Hibenate关联策略探讨

阅读更多
以下涉及的几个问题是在实际开发中经常或碰到的,大家也渐渐形成了所谓的“最佳实践”,不过还存在一些问题,没有好的方案,请大家一起探讨。
1、是否延迟加载
    为了保持较好的性能,通常我们会选择延迟加载关联对象,这一点在one-to-many、many-to-one中体现最深。然而在下列情形中我们可能需要立刻加载关联的对象:
有一个Topic表,一个Comment表,Topic有一些统计信息例如浏览次数、回复次数、最后回复时间(回复者),这些信息是需要在查询Topic时立刻加载的。通常有两种方案:
1)将这些信息保存在Topic中,即topic表中含有这些统计信息字段。
    这种设计的问题:这些统计信息需要经常修改,例如有了新的回复,这会引起对topic表的更新,由于topic表的内容较多(含有text类型的字段),更新时性能影响较大。

2)将这些统计信息单独放在另一张表topic_stat。
    由于要立刻加载这些统计信息,所以要使用one-to-one主键关联,即将topic的主键作为topic_stat的主键,但是很不幸,这里又引起了另一个问题:每次对topic的分页查询都会再发送n个sql去查询关联的topic_stat,也就是n+1问题;而查询指定id的topic会使用left out join的方式抓取关联的topic_stat。所以这里的瓶颈是n+1问题。

    所以以上两种方案都不是理想的方案,有人提出使用唯一外键关联的方式避免n+1问题,但是这种方式会lazy加载关联对象,在需要立刻加载关联对象的情景下(如topic需要立刻加载topic_stat),这种方法是不适用的(对于不需要立刻加载而体现为一对一关系的情况下,唯一外键关联是一种很好的方案)。

2、OpenSessionInView
   针对需要立刻加载,而又想避免由于使用one-to-one主键关联引起n+1查询的问题,有人提出使用OpenSessionInView方法,这种方法也是可以接受的方案,但是由于session的打开是在请求到来就开始,视图渲染完毕之后才关闭,这中间的时间间隔较大,对于数据库访问频繁的应用来讲,不是一种好的方案。

结合上面的讨论,我想大家都有各自的看法,请大家分享一下。
分享到:
评论
6 楼 cmzx3444 2010-02-08  
ch_space 写道
[size=medium]以下涉及的几个问题是在实际开发中经常或碰到的,大家也渐渐形成了所谓的“最佳实践”,不过还存在一些问题,没有好的方案,请大家一起探讨。
1)将这些信息保存在Topic中,即topic表中含有这些统计信息字段。
    这种设计的问题:这些统计信息需要经常修改,例如有了新的回复,这会引起对topic表的更新,由于topic表的内容较多(含有text类型的字段),更新时性能影响较大。
size]

这个问题我想可以这么解决,在Topic对象中有个属性,比如是最新发布者:lastReply,和回复数:countReply,但是这两个都住存数据库,当对象加载后,我们再构建出完整的Topic对象,并放会缓存,这样有新的回复就更新缓存,数据库中的酒不用更新了,回复数直接加上去就可以了,最后的回复就把lastReply更新一下就可以了,但是有个问题我不知道怎么搞,那就是帖子浏览量的问题,难道我没点一次帖子就更新一下帖子
5 楼 hxl1013 2010-01-07  
ch_space 写道


2)将这些统计信息单独放在另一张表topic_stat。
    由于要立刻加载这些统计信息,所以要使用one-to-one主键关联,即将topic的主键作为topic_stat的主键,但是很不幸,这里又引起了另一个问题:每次对topic的分页查询都会再发送n个sql去查询关联的topic_stat,也就是n+1问题;而查询指定id的topic会使用left out join的方式抓取关联的topic_stat。所以这里的瓶颈是n+1问题。

左连接了,就是n的问题了
4 楼 hxl1013 2010-01-07  
ch_space 写道

1)将这些信息保存在Topic中,即topic表中含有这些统计信息字段。
    这种设计的问题:这些统计信息需要经常修改,例如有了新的回复,这会引起对topic表的更新,由于topic表的内容较多(含有text类型的字段),更新时性能影响较大。

Hibernate应该有控制使得只去更新更改过的数据,所以这不是个问题
3 楼 walle1027 2009-12-30  
onkyo 写道
我推荐用aop的形式延迟加载. 想法是在hibernate的HibernateProxy上再加上一个动态代理。 当get函数被调用前可以先判断hibernateproxy有没有被初始化, 如果过初始化了就继续, 如果没有初始化打开session然后加载hibernateproxy, 然后关闭session。 返回已经加载的值。

那这样要代理所有get方法,会不会性能上有问题?
2 楼 yfddht1573 2009-12-07  
ch_space 写道
1)将这些信息保存在Topic中,即topic表中含有这些统计信息字段。
    这种设计的问题:这些统计信息需要经常修改,例如有了新的回复,这会引起对topic表的更新,由于topic表的内容较多(含有text类型的字段),更新时性能影响较大。


小弟有个提义就是。为什么不把这种含有text的字段放在另一表中去喃?
1 楼 onkyo 2009-12-04  
我推荐用aop的形式延迟加载. 想法是在hibernate的HibernateProxy上再加上一个动态代理。 当get函数被调用前可以先判断hibernateproxy有没有被初始化, 如果过初始化了就继续, 如果没有初始化打开session然后加载hibernateproxy, 然后关闭session。 返回已经加载的值。

相关推荐

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    hibernate关联关系总结

    Hibernate关联关系是Java持久化框架Hibernate中的核心概念,它允许我们在数据库中建立对象之间的关系映射,以便在程序中操作对象时,可以自动处理与数据库的交互。本篇将深入探讨Hibernate的四种主要关联关系:一对...

    hibernate关联关系实例

    在这个“hibernate关联关系实例”中,我们将深入探讨四种基本的关联关系:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及多对多(Many-to-Many),同时也会涉及Hibernate查询语言(HQL)...

    Hibernate关联关系疑问

    这篇博客"Hibernate关联关系疑问"可能探讨了在使用Hibernate处理对象关系映射(ORM)时遇到的一些关联问题。在ORM中,关联关系是数据库表之间的连接,如一对一、一对多、多对一和多对多关系。 1. **一对一关联...

    hibernate一对一关联关系

    本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作...

    Hibernate关联关系总结

    本篇文章将深入探讨Hibernate中的三种主要关联关系:一对一、一对多和多对多。 **一对一关联(One-to-One)** 一对一关联在现实生活中很常见,例如一个人只有一个身份证。在Hibernate中,这种关联可以通过`@...

    hibernate 关联映射(二) one to one(单向)

    本篇文章将深入探讨Hibernate中的关联映射,特别是One-to-One(一对一)关联,这是一种表示两个实体之间一对一关系的映射方式。我们将通过源码分析和实际例子来理解其工作原理。 ### 一、One-to-One关联概述 在...

    Hibernate一对一主键关联映射(双向关联)

    本篇文章将详细探讨双向一对一主键关联映射的概念、配置以及实际应用。 首先,我们需要了解一对一关联的类型。一对一关联分为两种:基于主键的关联(Primary Key Association)和基于外键的关联(Foreign Key ...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    注解配置 javabean hibernate 关联关系

    本篇文章将深入探讨如何使用注解配置Java Bean并建立Hibernate的关联关系。 首先,我们需要理解Java Bean的概念。Java Bean是一种符合特定规范的Java类,通常包含属性、getter和setter方法以及构造函数。在...

    hibernate 全面学习->hibernate 关联映射学习

    本文将深入探讨Hibernate的关联映射学习,包括一对多、多对一、一对一等多种关系映射的方式。 首先,我们来看一下“一对多”(One-to-Many)的映射关系。在Hibernate中,这种关系通常用在一个实体可以拥有多个子...

    hibernate 关联表问题

    本文将深入探讨“Hibernate关联表问题”,基于给出的标题和描述,我们将重点讨论Hibernate中的多对多(Many-to-Many)关联映射。 在关系型数据库中,多对多关联是最复杂的一种关系,比如用户可以有多个角色,角色也...

    hibernate在单端关联上的lazy策略

    标签中的“源码”可能意味着博客深入探讨了Hibernate的内部实现,包括懒加载策略在源码中的体现和执行流程。而“工具”则可能涵盖了如何在实际项目中使用Hibernate的懒加载功能。 在压缩包文件“hibernate_lazy_for...

    Hibernate数据关联技术笔记

    在Java的持久化框架Hibernate中,数据关联技术是其核心特性之一,它使得对象关系映射(ORM)更加灵活和高效。本笔记将深入探讨...在实际开发中,还需要根据业务需求灵活调整关联策略,确保数据的完整性和一致性。

    hibernate 缓存策略

    本文将深入探讨Hibernate的缓存策略,包括一级缓存、二级缓存以及查询缓存,并结合源码分析其工作原理。 ### 一级缓存 一级缓存是Hibernate默认开启的缓存,也称为Session缓存。每当我们在Session中进行持久化操作...

    Hibernate 关联映射

    这可能是测试Hibernate关联映射的一个示例项目或者类。通常,这样的测试会包含各种关联映射的实例,如实体类的定义,配置文件或注解,以及测试用例,用于验证关联映射是否按预期工作。 **详细知识讲解:** 1. **一...

    day36 06-Hibernate抓取策略:set集合上的抓取策略

    今天我们要探讨的是Hibernate的抓取策略,特别是针对set集合的策略。在大型应用中,有效地管理数据加载能显著提升性能,减少数据库交互次数,这就是抓取策略的核心作用。 首先,我们需要理解什么是抓取策略。在...

    hibernate关联映射

    **Hibernate关联映射详解** 在Java的持久化框架中,Hibernate是一个非常强大的工具,它使得开发者可以更加方便地处理数据库操作。其中,关联映射是Hibernate的核心特性之一,它允许我们将对象模型与关系数据库模型...

    hibernate自身关联一对多实例(树形结构)

    本文将深入探讨“Hibernate自身关联一对多实例(树形结构)”这一主题,这在构建具有层次结构的数据模型时尤其常见,例如组织结构、地区树或者商品分类等。 首先,我们需要理解Hibernate的核心概念。Hibernate允许...

Global site tag (gtag.js) - Google Analytics