mysql - 在没有 session /连接到 DB 的情况下使用 Hibernate 生成(批量)SQL 查询的线索

标签 mysql hibernate bulkinsert

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

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

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

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

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

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

最佳答案

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

可以加速的事情

  • 分批处理并在每次处理后使用 session.clear() 清除之前缓存的数据(否则刷新会随着时间的推移变得更加昂贵)
  • 加载对象图时使用预取路径
  • 在每次 clear()
  • 后缓存经常需要的数据 (XYZType) inmemory 和 session.attach
  • 使用时间最多的个人资料
  • 不确定它是否适用于 hibernate 但 NHibernate 有反射优化器:使用 sessionfactories 类元数据而不是反射来设置属性
  • 启用更新语句的批处理

关于mysql - 在没有 session /连接到 DB 的情况下使用 Hibernate 生成(批量)SQL 查询的线索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10447213/

相关文章:

php - 使用php从mysql编码或解码字符串

MySQL 字符集转换

java - hibernate java好奇心 - 保存对象后,要保存的对象和已保存的对象都设置了id

c# - 将数百万条记录从平面文件插入 SQL Server 的陷阱是什么?

c# - Entity Framework 映射 API 引用错误

mysql - ITerm2 未加载点配置文件,因此找不到 mysql 命令

php - 无法向数据库插入MCRYPT加密数据

mysql - Hibernate 按子表的 Id 排序

java - 如何为hibernate注释生成的UUID添加前缀?

.net - 从 SQL Server 中的 XML 批量插入