簡體   English   中英

如何處理具有多個批處理插入的表的主鍵?

[英]How can I handle the primary key of a table with multiple batch inserts?

我以前在開發一款實時填充ODS的應用程序。 每次確定給定表的所有記錄都是正確的,將調用特定於每個表PK的序列對象以生成PK。 一旦返回,它將被存儲在Map中,以供同一會話中其他表的FK引用中使用; 它是直接插入的,不是自動生成的。 我了解該序列是線程安全的,因為
一位朋友提到,在他先前在另一家公司的項目中,他們使用批處理,並簡單地使用max index +1的范圍直到要插入的行數。 但是,表被鎖定在應用程序的一個實例中,而不是群集中。
假設有人想支持同一表集合的批處理和實時操作。 使用存儲過程,可以:

  1. 鎖定序列對象。
  2. 通過#個行的參數將其遞增。
  3. 將最后一個值存儲在臨時變量中。
  4. 解鎖序列對象。
  5. 最后,返回temp變量。

這個想法的第一個問題是,除非鎖定序列的命令可以被阻止,否則沒有什么可以阻止此存儲過程同時運行多次的。 如果有人可以提供更好的解決方案(主要在Java方面),我會添加J2E標記。

您不能鎖定DB2 SEQUENCE ,也不需要鎖定。 DB2引擎處理序列同步並確保每個並發會話都接收無沖突的序列值。

對於批處理插入,您可以將序列緩存設置為批處理大小,這可以顯着提高並發性。

您可以通過多種方式獲取最后生成的序列值,以用作外鍵值。 最簡單的方法是使用PREVIOUS VALUE FOR <sequence name>表達式並將結果存儲在應用程序變量中。 一種替代方法是查詢INSERT數據更改表

SELECT id INTO :my_fk_variable FROM FINAL TABLE (
 INSERT INTO my_table (id, something) 
 VALUES (NEXT VALUE FOR my_sequence, 'whatever'))

使用隨機生成的16字節主鍵。 在您的Java代碼中生成它們。 無需查找它們。 極低的碰撞風險。 主-主復制友好。 永不鎖定。 批量分配任意數量。 索引內的出色性能(出色的鍵分散性)。

也稱為:GUID或UUID。

就像是:

  1. 交易開始
  2. 更改順序(按行數遞增) 1
  3. 將最后一個值存儲在臨時變量中。
  4. 返回臨時變量。
  5. 交易結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM