更新表的多行的最快方法是啥

Posted

技术标签:

【中文标题】更新表的多行的最快方法是啥【英文标题】:What is the fastest way to update multiple rows of a table更新表的多行的最快方法是什么 【发布时间】:2018-07-08 00:26:08 【问题描述】:

我有一个名为messages 的表,其中包含toUsermessagestatus 列。 我想更新特定用户的所有消息状态。

所以,我写了一个这样的查询,

Session s = DB.getSession();
s.createSQLQuery("UPDATE `message` SET `status`='0' WHERE `toUser`='3'").executeUpdate();
s.close();

但后来有人告诉我,使用纯休眠方法进行更新更快更有效(我认为它必须与休眠池做一些事情),如下所示。

Session s = DB.getSession();
Transaction tr = s.beginTransaction();
Criteria cr = s.createCriteria(Connection.Pojo.Message.class);
cr.add(Restrictions.eq("toUser", 3));
List<Connection.Pojo.Message> l = cr.list();
for (Connection.Pojo.Message msg : l) 
    msg.setStatus((byte) 0);
    s.update(msg);

tr.commit();
s.close();

那么,我的问题是更新这些行的最快方法是什么?如果可能,请提供详细的答案。

感谢您的任何建议。

【问题讨论】:

我不确定 Hibernate 如何比简单的 SQL 查询更快 我认为是因为休眠池... 这是您应用程序的性能瓶颈吗?您应该谨慎对待以代码可读性和可维护性为代价的过早优化。如果您使用的是 Hibernate,根据经验,您应该避免使用普通 SQL 并安全地处理数据访问类型,例如标准 API。 @MickMnemonic 我在所有地方都使用过休眠,除了这个...... 【参考方案1】:

我认为“纯 Hibernate 方法”是指使用HQL update:

Session s = DB.getSession();
s.createQuery("UPDATE message m SET m.status=:newStatus WHERE toUser=:userId")
    .setInteger("newStatus", 0)
    .setInteger("userId", 3)
    .executeUpdate();
s.close();

这种方法提供的性能与您的 SQL 解决方案相当。

【讨论】:

以上是关于更新表的多行的最快方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

将数据插入 Oracle 表的最快方法是啥?

MongoDB - 更新集合中所有记录的最快方法是啥?

以编程方式安装或更新到最新版本的全局包的最快方法是啥?

更新数据库表的最快方法

在不使用 if 的情况下插入/更新 std::unordered_map 元素的最快方法是啥?

在弹簧靴后端存储“现金标签”的股票代码和名称的最快方法是啥?