1

我有一个特定的情况,我想知道 hibernate 如何使用它的模式元数据来生成 HQL 或者如果需要的话。

因此,我遇到了需要将对象图更新到 DB 的情况,交易是只有具有非空(或非默认)值的字段需要更新。这是我的用例:我们有一个批量编辑功能,它允许我们的后端支持团队能够为特定产品更新大约 25-30 个字段。因此,他们提供产品 ID,并且需要更新该列的值。

然而,在这种情况下使用休眠是有其代价的,我们从数据库中提取整个大对象图,然后更新特定字段并执行 Session.merge。作为没有。编辑数量正在增加,这增加了 CPU 使用率,现在我们必须重新设计它,使其负载增加 5 倍。

所以我们想转向生成 sql 查询,然后运行批量更新(即使这意味着直接在 SQL 中运行它们)。但是我想知道,hibernate 已经巧妙地使用元数据来生成查询。如果我只能使用某种拦截器,它只允许包含非空值的字段用于查询生成。

所以这是一个大而模糊的问题:hibernate 如何生成查询。是否有一个好的起点,或者有人知道以前是否曾尝试过类似的事情。

这个问题可能看起来像将 CSV 批量上传到 MySQL,但事实并非如此。批量上传/编辑主要是编辑同一张表的记录,在这种情况下,字段属于10个不同的表,因此需要推断相关的连接。我只是想使用休眠来避免脏的 IF-ELSE stmt 生成 SQL 代码。

4

1 回答 1

0

我已经从不同的 Schema 完成了数据迁移,200 万条记录的加载、转换/合并与现有记录大约需要 30 分钟,保存在我的开发机器上。所以也许还有改进的余地

可以加速的事情

  • 分批工作并session.clear()在每个之后使用以摆脱以前缓存的数据(否则随着时间的推移刷新会变得更加昂贵)
  • 加载对象图时使用预取路径
  • 将经常需要的数据(XYZType)缓存在内存和 session.attach 之后clear()
  • 使用时间最多的个人资料
  • 不确定它是否适用于休眠,但 NHibernate 有反射优化器:使用 sessionfactories 类元数据而不是反射来设置属性
  • 启用更新语句的批处理
于 2012-05-08T08:31:31.840 回答