SQL,选择和更新

SQL,选择和更新,sql,select,sql-update,Sql,Select,Sql Update,我试图在包含100000行的数据库中选择100行,并在之后更新这些行 问题是我不想为了这个目的去DB两次,因为更新只将这些行标记为已读 在java中使用简单的jdbc库有什么方法可以做到这一点吗?希望不使用存储过程 更新:好的,这里有一些澄清 有几个相同应用程序的实例运行在不同的服务器上,它们都需要选择100个未读行,按照创建日期列排序,读取其中的blob数据,将其写入文件并将该文件ftp到某个服务器。我知道是史前的,但需求就是需求 读取和更新部分用于确保每个实例获得不同的数据集。按照顺序,像赔

我试图在包含100000行的数据库中选择100行,并在之后更新这些行

问题是我不想为了这个目的去DB两次,因为更新只将这些行标记为已读

在java中使用简单的jdbc库有什么方法可以做到这一点吗?希望不使用存储过程

更新:好的,这里有一些澄清

有几个相同应用程序的实例运行在不同的服务器上,它们都需要选择100个未读行,按照创建日期列排序,读取其中的blob数据,将其写入文件并将该文件ftp到某个服务器。我知道是史前的,但需求就是需求

读取和更新部分用于确保每个实例获得不同的数据集。按照顺序,像赔率和均衡这样的把戏是行不通的:/

我们选择要更新的数据。数据通过电线传输,我们等了又等,然后更新为读取。然后松开锁进行读取。这整件事花的时间太长了。通过同时读取和更新,我想减少从使用select for update到实际更新的锁定时间,这样使用多个实例将增加每秒读取行数


仍然有想法吗?

你不能只使用同一个连接而不关闭它吗?

你不能只使用同一个连接而不关闭它吗?

去数据库并不是那么糟糕。如果您没有返回任何“跨线”的内容,那么更新不应该对您造成太大的损害,并且只返回几十万行。你担心什么?

去DB没那么糟糕。如果您没有返回任何“跨线”的内容,那么更新不应该对您造成太大的损害,并且只返回几十万行。您担心什么?

如果您在JDBC中执行SELECT并迭代结果集以更新每一行,那么您就错了。这是一个n+1查询问题,永远不会很好地执行

只需使用WHERE子句进行更新,该子句确定哪些行需要更新。这是一个单一的网络往返的方式


不要太以代码为中心。让数据库完成它设计的任务。

如果您在JDBC中执行SELECT并迭代结果集以更新每一行,那么您就错了。这是一个n+1查询问题,永远不会很好地执行

只需使用WHERE子句进行更新,该子句确定哪些行需要更新。这是一个单一的网络往返的方式


不要太以代码为中心。让数据库完成它设计的任务。

在我看来,这里可能有不止一种方法来解释这个问题

您正在为该行选择行 唯一目的是更新它们,以及 不读。 您正在选择要显示的行 给某人,并将他们标记为 一次读一本,或者全部作为一个小组阅读。 您希望选择行并标记 它们在您选择时已被读取 他们 让我们先选择选项1,因为这似乎是最简单的。您不需要选择行来更新它们,只需使用WHERE子句发出更新:

update table_x
set read = 'T'
where date > sysdate-1;
查看选项2,您希望在用户已读取它们或下游系统已接收到它们时,将它们标记为已读,或者其他任何情况。为此,您可能需要进行另一次更新。如果查询主键,除了在第一次选择中需要的其他列之外,更新可能会更容易,因为DB不必进行表或索引扫描来查找行

在JDBCJava中,有一种执行批量更新的工具,您可以一次执行一组更新。当我需要执行许多形式完全相同的更新时,这种方法效果很好


选项3,您希望在其中一次选择并更新全部。我个人觉得这没什么用,但这并不意味着其他人没有。我想某种存储过程会减少往返。我不确定您在这里使用的数据库是什么,也无法提供具体信息。

在我看来,这里可能有多种解释问题的方法

您正在为该行选择行 唯一目的是更新它们,以及 不读。 您正在选择要显示的行 给某人,并将他们标记为 一次读一本,或者全部作为一个小组阅读。 您希望选择行并标记 它们在您选择时已被读取 他们 让我们先选择选项1,因为这似乎是最简单的。您不需要选择行来更新它们,只需使用WHERE子句发出更新:

update table_x
set read = 'T'
where date > sysdate-1;
查看选项2,您希望在用户已读取它们或下游系统已接收到它们时,将它们标记为已读,或者其他任何情况。为此,您可能需要进行另一次更新。如果查询主键,除了在第一次选择中需要的其他列之外,更新可能会更容易,因为DB不必进行表或索引扫描来查找行< /p> 在JDBCJava中,有一种执行批量更新的工具,您可以一次执行一组更新。当我需要执行许多形式完全相同的更新时,这种方法效果很好

选项3,您希望在其中一次选择并更新全部。我个人觉得这没什么用,但这并不意味着其他人没有。我想某种存储过程会减少往返。我不确定您在这里使用的是什么db,也不能提供具体信息