【问题标题】:Hibernate strategies fetch multiple tables offline?休眠策略离线获取多个表?
【发布时间】:2012-06-20 17:27:03
【问题描述】:

听起来很疯狂,但这就是故事。

背景:

  • 想象我们的数据库看起来像:公司有 n 个员工,有配偶和孩子。员工也有带轮胎的汽车......等等......
  • 我们的应用程序提供 Web 和桌面 UI。因此,用户希望从多个表中加载数据,以便在桌面上离线工作。例如:将大约 1000 家公司加载到桌面进行工作。
  • 数据量有点大,从数千条记录到有时十万条记录不等。但是离线加载的数据并没有那么大,只有几千个。

当前架构:

  • 我们使用HibernateAssembler from Adobe ADEP4.6,与 DAO 非常相似,例如,对于每个实体,我们都有一个汇编程序。但是对 Hibernate 的访问非常有限。
  • 对于 Web,我们使用 LAZY Loading,到目前为止一切顺利。
  • 对于 AIR 桌面,我们正在尝试多种选择

AIR 桌面的选项,注意 Entity 都标记为 LAZY,我们正在考虑以下选项之一:

  1. 在命名 hql 中使用“fetch join”:将公司、员工、汽车、轮胎一起加载到一个 hql 中
  2. 单独加载每个表,然后手动匹配它们。
  3. 将 EAGER FETCH 与 BatchSize 一起使用?!!难以控制
  4. 放弃 Hibernate 并返回到大型 JDBC 查询。

请给我们您的建议。谢谢

【问题讨论】:

    标签: hibernate lazy-loading parent-child fetch


    【解决方案1】:
    1. 如果您有多个 1-N 关系,则返回的 ResultSet 将包含太多冗余数据,以我的经验,Hibernate 处理速度太慢。

    2. 我会使用 Hibernate 或纯 SQL 来解决这个问题。实际上,Hibernate 可以在一定程度上做到这一点,方法是用 @Fetch(FetchMode.SUBSELECT) 注释你的关系。 例如,当您根据条件检索一些公司时,将运行以下 SQL:

      SELECT * FROM company WHERE condition
      SELECT * FROM employee WHERE employee.company_id IN (SELECT id FROM company WHERE condition)
      

      请注意,这仅在某些数据库中有效。如果表现不佳,请考虑 #3。

    3. 我在这种情况下尝试过 BatchSize,它在一定程度上提高了性能,但选项 #2 更好。

    4. 归结为 SQL 运行。如果这样做是有效的,Hibernate 通常不会增加那么多开销(只有对象创建、将所有对象保存在内存中等的开销)

    【讨论】:

    • 谢谢,我还在努力。我对你的回答很满意,但让我们看看其他人的想法
    • 经过多次测试,我们决定使用:@Fetch(FetchMode.SUBSELECT) 它可以节省很多性能。然后根据具体情况,可以是 LAZY 或 EAGER。与#1结合使用也很好
    • 关于选项2,您所说的“一定程度”是什么意思?这是否意味着它在某些情况下不起作用?
    • 它肯定会起作用,但是它可能无法为特定数据库提供最佳性能(带有子查询的 IN 子句并不总是很快,取决于 DB)
    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多