使用Hibernate生成(批量)SQL查询而不会话/连接到DB的线索

时间:2012-05-04 10:38:12

标签: mysql hibernate bulkinsert

我有一个特定的情况,我想知道hibernate如何使用其架构元数据来生成HQL或者如果需要SQL。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我已经完成了来自不同Schema的数据游戏,对于带有加载,转换/合并现有的200万条记录花了大约30分钟,保存在我的开发机上。所以也许还有改进的余地

可能加速的事情

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