2009-01-03 94 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,您希望一次性選擇和更新全部。我個人對此並沒有多大用處,但這並不意味着其他人不會這樣做。我想某種存儲過程會減少往返。我不確定你在這裏工作的數據庫,並且不能提供具體的信息。