0

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

背景:

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

当前架构:

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

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

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

请给我们您的建议。谢谢

4

1 回答 1

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 通常不会增加那么多开销(只有对象创建的开销,将所有对象保存在内存中等)

于 2012-06-20T21:24:34.420 回答