2009-01-03 66 views
1

我想在包含100000行的数据库中选择100行,并更新那些行后。SQL,选择和更新

问题是我不想为此目的去DB两次,因为更新只会将这些行标记为“已读”。

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

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

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

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

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

还有想法吗?

回答

0

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

1

去DB是不是很糟糕。如果你没有在线路上返回任何东西,那么更新不应该对你造成太大的损害,它只有几十万行。你担心什么?

1

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

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

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

2

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

  1. 您更新它们和 不读他们的 唯一目的选择行。
  2. 您正在选择行以向某人显示 ,并将其标记为 可以一次读取一个或全部读取为一个组。
  3. 您想要选择行并将它们标记为 它们在您选择 时已阅读它们。

让我们先选择选项1,因为这似乎是最简单的。你不需要为了更新他们选择的行,只是发出一个WHERE子句的更新:

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

望着选项2,要标记为已读当用户阅读(或者下游系统已经收到它,或者其他)。为此,您可能需要进行另一次更新。如果您查询主键,除了第一次选择需要的其他列之外,您可能会更容易更新,因为数据库不必执行表或索引扫描来查找行。

在JDBC(Java)中,有一种工具可以执行批量更新,您可以一次执行一组更新。当我需要执行大量完全相同的更新时,情况良好。

选项3,您希望一次性选择和更新全部。我个人对此并没有多大用处,但这并不意味着其他人不会这样做。我想某种存储过程会减少往返。我不确定你在这里工作的数据库,并且不能提供具体的信息。