首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Hibernate生成(批量) SQL查询而无需会话/连接到数据库的提示

使用Hibernate生成(批量) SQL查询而无需会话/连接到数据库的提示
EN

Stack Overflow用户
提问于 2012-05-04 18:38:12
回答 1查看 524关注 0票数 1

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

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

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

因此,我们希望转到生成sql查询,然后运行批处理更新(即使这意味着直接在SQL中运行它们)。然而,我想知道的是,hibernate已经巧妙地使用元数据来生成查询。如果我只能使用某种类型的拦截器,它只允许包含具有非空值的字段来生成查询。

所以这里有一个大的,模糊的问题: hibernate是如何生成查询的。有没有一个好的开始,或者有人知道以前是否有人尝试过这样的事情。

这个问题看起来像是将CSV批量上传到MySQL,但事实并非如此。批量上传/编辑主要是编辑同一个表的记录,此时字段属于10个不同的表,因此需要推断相关的joins。我只是尝试使用hibernate来避免使用脏的IF-ELSE stmt来生成SQL代码。

EN

回答 1

Stack Overflow用户

发布于 2012-05-08 16:31:32

我从不同的Schema进行了数据迁移,在我的开发mashine上加载、转换/合并现有的两百万条记录花了大约30分钟。所以也许还有改进的余地。

可以加快速度的事情

  • 以批处理方式工作,并在每次刷新后使用session.clear()来清除以前缓存的数据(否则刷新将随着时间的推移变得更加昂贵)
  • 在加载对象图时使用预取路径
  • 在内存中缓存经常需要的数据(XYZType),并在每次使用时间最多的会话之后使用session.attach
  • 不确定它是否适用于hibernate但NHibernate具有反射优化器:使用会话工厂类元数据而不是反射来设置update语句的会话批处理
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10447213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档