簡體   English   中英

從長遠來看,我可以在多大程度上信任 OracleDB 的 ROWID?

[英]How much can I trust OracleDB's ROWID in a long run?

我正在使用 Spring Boot 和 OracleDB 開發小型 POC。

情況是:

在應用程序啟動時,我從緩存中的數據庫加載了一些屬性(一些數據)。 會有頻繁的請求,我需要這些數據,因此我決定緩存它。 數據庫中的數據很少會改變。 只有偶爾有人可以使用 sql 腳本插入/刪除/更新幾行。 雖然它發生了變化,但我已經實現了 Oracle 的DB 更改通知,以向 spring 引導服務發送通知,通知某些數據已更改,並且緩存中的數據現在處於陳舊的 state 中。

在通知事件中,我只得到ROWID 偽列,它可用於指向數據庫中的哪一部分數據與我擁有的緩存不同。 為了更安全,我決定將 ROWID 緩存到 map 緩存中的數據和 DB 發送給我的通知事件中的數據 object。 在工作了幾天后,我發現 ROWID 並沒有改變,但是從長遠來看或在生產環境中,我應該相信 ROWID 的這種不變行為嗎?

很少有場景解釋清楚:

  1. 每次服務器重新啟動時,緩存都會自行重新加載。 因此,在服務器關閉時數據更改的情況是無法想象的。
  2. 我(直到 poc)使用 sql 查詢/腳本在數據庫中獲取每個插入/更新/刪除通知。

event.toString() 示例供參考:

Connection information  : local=view-localhost/127.0.0.1:47632, remote=view-localhost/127.0.0.1:57117
Registration ID         : 1201
Notification version    : 1
Event type              : QUERYCHANGE
Database name           : orcl
Query Change Description (length=1)
  query ID=41, query change event type=QUERYCHANGE
  Table Change Description (length=1):    operation=[INSERT], tableName=SYSTEM.PRODUCT, objectNumber=73323
    Row Change Description (length=1):
      ROW:  operation=INSERT, ROWID=AAAR5rAABAAAbHZAAA

假設您的表沒有啟用row_movement (檢查dba_tables )。

你需要小心刪除然后插入 - 這些邏輯上會給一行一個新的 rowid (畢竟這是一個全新的行)。 您還需要注意表移動,這是一項密集的操作,無論如何都需要重建索引,因此不太可能在沒有太多通知的情況下發生。

否則,一行將保持它的 rowid。

暫無
暫無

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

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