我正在尝试在包含100000行的数据库中选择100行,并在更新后更新这些行。
问题是我不想为此目的两次去DB,因为update只会将这些行标记为“read”。
有没有办法在java中使用简单的jdbc库来做到这一点? (希望不使用存储过程)
更新:好的,这里有一些澄清。
在不同的服务器上运行相同应用程序的几个实例,它们都需要选择100个根据creation_date列排序的“UNREAD”行,读取其中的blob数据,将其写入文件并将该文件ftp到某个服务器。 (我知道史前但要求是要求)
读取和更新部分用于确保每个实例获得不同的数据集。 (按顺序,像赔率和平均值一样的技巧不会起作用:/)
我们选择要更新的数据。数据通过线路传输(我们等待和等待),然后我们将它们更新为“READ”。然后释放锁定阅读。整个事情需要太长时间。通过同时读取和更新,我想减少锁定时间(从我们使用select更新到实际更新的时间),以便使用多个实例将增加每秒的读取行数。
还有想法吗?
答案 0 :(得分:2)
在我看来,这里可能有不止一种方法来解释这个问题。
让我们首先选择选项1,因为这似乎是最简单的。您不需要选择行来更新它们,只需使用WHERE子句发出更新:
update table_x
set read = 'T'
where date > sysdate-1;
查看选项2,您希望在用户读取它们时(或下游系统已收到它或其他任何内容)将它们标记为已读。为此,您可能需要进行另一次更新。如果查询主键,除了第一个选择中需要的其他列之外,您可能会更容易更新,因为数据库不必执行表或索引扫描来查找行
在JDBC(Java)中,可以进行批量更新,您可以同时执行一组更新。当我需要执行大量完全相同的更新时,这很有效。
选项3,您想要一次性选择和更新所有内容。我个人并没有太多用处,但这并不意味着其他人没有。我想某种存储过程会减少往返次数。我不确定你在这里使用什么数据库,并且不能真正提供细节。
答案 1 :(得分:1)
转到数据库并不是那么糟糕。如果你没有通过电线返回任何东西,那么更新不应该对你造成太大的伤害,而且只有几十万行。你有什么担心?
答案 2 :(得分:1)
如果您在JDBC中执行SELECT并在ResultSet上迭代以更新每一行,那么您做错了。这是一个永远不会表现良好的(n + 1)查询问题。
只需使用WHERE子句执行UPDATE,该子句确定需要更新哪些行。这是一次单一的网络往返。
不要过于以代码为中心。让数据库完成它的设计工作。
答案 3 :(得分:0)
不能在不关闭的情况下使用相同的连接吗?