1

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

问题是我不想为此目的两次访问数据库,因为更新仅将这些行标记为“已读”。

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

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

有几个相同应用程序的实例运行在不同的服务器上,它们都需要选择根据 creation_date 列排序的 100 条“未读”行,读取其中的 blob 数据,将其写入文件并将该文件通过 ftp 传输到某个服务器。(我知道史前,但要求是要求)

读取和更新部分是为了确保每个实例获得不同的数据集。(按顺序,像赔率和偶数这样的技巧不会起作用:/)

我们选择数据进行更新。数据通过线路传输(我们等待并等待),然后我们将它们更新为“READ”。然后释放锁定以进行阅读。整个事情花费的时间太长了。通过同时读取和更新,我想减少锁定时间(从我们使用 select 进行更新到实际更新的时间),以便使用多个实例会增加每秒读取的行数。

还有想法吗?

4

4 回答 4

2

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

  1. 您选择行的唯一目的是更新它们而不是读取它们。
  2. 您正在选择要向某人显示的行,并将它们标记为一次读取一个或全部作为一组读取。
  3. 您希望在选择行时选择行并将其标记为已读。

让我们先选择选项 1,因为这似乎是最简单的。您不需要选择行来更新它们,只需使用 WHERE 子句发出更新:

update table_x
set read = 'T'
where date > sysdate-1;

查看选项 2,您希望在用户阅读它们时将它们标记为已读(或下游系统已收到它,或其他)。为此,您可能需要进行另一次更新。如果您查询主键,除了在第一次选择中需要的其他列之外,您可能会更轻松地进行更新,因为数据库不必进行表或索引扫描来查找行.

在 JDBC (Java) 中,有一种工具可以进行批量更新,您可以在其中一次执行一组更新。当我需要执行大量完全相同形式的更新时,效果很好。

选项 3,您要在其中一次性选择和更新所有内容。我个人觉得这没什么用,但这并不意味着其他人没有。我想某种存储过程会减少往返。我不确定您在这里使用的是什么数据库,也无法真正提供细节。

于 2009-01-03T21:57:40.983 回答
1

去数据库还不错。如果您没有“通过网络”返回任何内容,那么更新不应该对您造成太大的损害,而且它只有几十万行。你担心什么?

于 2009-01-03T21:25:01.113 回答
1

如果您在 JDBC 中执行 SELECT 并遍历 ResultSet 以更新每一行,那么您做错了。这是一个 (n+1) 查询问题,永远不会很好地执行。

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

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

于 2009-01-03T21:41:45.417 回答
0

你不能只使用相同的连接而不关闭它吗?

于 2009-01-03T21:20:33.010 回答