![](/img/trans.png)
[英]How can I query a null in a Long value without getting “Expected NUMBER but got BINARY” from OracleDB?
[英]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 的這種不變行為嗎?
很少有場景解釋清楚:
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.