SQL,选择和更新
我试图在包含100000行的数据库中选择100行,并在之后更新这些行 问题是我不想为了这个目的去DB两次,因为更新只将这些行标记为已读 在java中使用简单的jdbc库有什么方法可以做到这一点吗?希望不使用存储过程 更新:好的,这里有一些澄清 有几个相同应用程序的实例运行在不同的服务器上,它们都需要选择100个未读行,按照创建日期列排序,读取其中的blob数据,将其写入文件并将该文件ftp到某个服务器。我知道是史前的,但需求就是需求 读取和更新部分用于确保每个实例获得不同的数据集。按照顺序,像赔率和均衡这样的把戏是行不通的:/ 我们选择要更新的数据。数据通过电线传输,我们等了又等,然后更新为读取。然后松开锁进行读取。这整件事花的时间太长了。通过同时读取和更新,我想减少从使用select for update到实际更新的锁定时间,这样使用多个实例将增加每秒读取行数SQL,选择和更新,sql,select,sql-update,Sql,Select,Sql Update,我试图在包含100000行的数据库中选择100行,并在之后更新这些行 问题是我不想为了这个目的去DB两次,因为更新只将这些行标记为已读 在java中使用简单的jdbc库有什么方法可以做到这一点吗?希望不使用存储过程 更新:好的,这里有一些澄清 有几个相同应用程序的实例运行在不同的服务器上,它们都需要选择100个未读行,按照创建日期列排序,读取其中的blob数据,将其写入文件并将该文件ftp到某个服务器。我知道是史前的,但需求就是需求 读取和更新部分用于确保每个实例获得不同的数据集。按照顺序,像赔
仍然有想法吗?你不能只使用同一个连接而不关闭它吗?你不能只使用同一个连接而不关闭它吗?去数据库并不是那么糟糕。如果您没有返回任何“跨线”的内容,那么更新不应该对您造成太大的损害,并且只返回几十万行。你担心什么?去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,也不能提供具体信息