我有一個HashMap,我正在序列化和反序列化爲Oracle數據庫,在BLOB數據類型字段中。 我想使用此字段執行查詢。 例如,應用程序將創建一個新的HashMap,並且有一些鍵值對。 我想查詢數據庫,看看這個數據的HashMap是否已經存在於數據庫中。 我不知道如何做到這一點,似乎很奇怪,如果我必須去db中的每個記錄,反序列化它,然後比較,SQL處理比較BLOBs,所以我可以... select * from processesES where foo =?....和foo是一個BLOB類型,並且?是新的HashMap的一個實例? 謝謝將對象序列化爲Oracle中的BLOB
回答
這裏有一篇文章供您閱讀:Pounding a Nail: Old Shoe or Glass Bottle
我還沒有聽到太多關於你的應用程序的基礎架構,但我可以馬上有從未一個告訴你之所以需要以這種方式使用HashMap。它是一種不好的技術,簡單明瞭。
您的問題的答案不是一個聰明的Oracle查詢,它是您的應用程序架構的重新設計。
首先,您不應該將HashMap序列化到數據庫(更一般地說,您不應該序列化任何需要查詢的內容)。它更容易創建一個表來表示應用程序中包含HashMap如下:
HashMaps -------- MapID (pk int) Key (pk varchar) Value
一旦你有你的包含HashMap的數據庫中的內容,它的瑣碎查詢數據庫,查看數據是否已經存在或產生任何其他類型的彙總數據:
SELECT Count(*) FROM HashMaps where MapID = ? AND Key = ?
我沒有需要比較BLOB,但它似乎是通過dbms_lob
包支持。
見dbms_lob.compare()
在http://www.psoug.org/reference/dbms_lob.html
我可以不同意,但我被告知這樣做。 我很欣賞你的解決方案,這就是我以前的樣子。 感謝
在數據庫中存儲序列化對象是幾乎總是一個壞主意,除非你提前知道的時候,你不需要對查詢他們。
你是如何序列化HashMap的?有很多方法可以序列化數據和像HashMap這樣的對象。比較兩個地圖,特別是序列化的地圖,並不是微不足道的,除非你的序列化技術保證兩個等價的地圖總是以相同的方式序列化。
解決這個問題的一種方法是對一些很少需要查詢的對象使用XML序列化。例如,在我工作的地方,我們有一個日誌表,其中某個日誌消息作爲XML文件存儲在CLOB字段中。這個XML數據表示一個序列化的Java對象。通常我們會查詢記錄中的其他列,並且只能以單個原子步驟讀/寫blob。然而,有一次或兩次需要對blob進行深入檢查,並使用XML來允許這種情況發生(Oracle支持在varchar2或CLOB字段以及本機XML對象中查詢XML)。如果謹慎使用,這是一項有用的技術。
調查dbms_crypto.hash來製作你的blob的散列。將散列存儲在blob旁邊,它會給你一些東西來縮小搜索範圍,使之更易於管理。我不推薦存儲哈希映射,但這是搜索斑點之間精確匹配的通用技術。 另請參見SQL - How do you compare a CLOB
Oracle可以使用Java定義新的數據類型(或Windows上的.net),您可以爲序列化對象定義數據類型並定義查詢如何處理它。
缺乏好,如果你試試這個...
如果您的序列數據,XML,並將數據存儲在XML,那麼你可以在你的SQL查詢中使用的XPath。 (對不起,因爲我更多的是SqlServer的人,我不知道如何做到這一點Oracle中的細節。)
- 如果你每天只需要更新序列化的數據的部分不做這個。
- 同樣,如果任何數據是由其他數據指向或指向其他數據不這樣做。
- 1. 將Azure Blob流反序列化爲Json對象
- 2. 如何將一般對象序列化爲Json並將Json反序列化爲Java中的對象
- 3. 將XML反序列化爲C#對象
- 4. 將XML反序列化爲C#對象
- 5. 將對象序列化爲JSON
- 6. 如何將對象序列化爲XML
- 7. 將.NET對象序列化爲JSON
- 8. 將FeedParser對象序列化爲Atom
- 9. 將對象序列化爲XML
- 10. 將對象序列化爲XML Java
- 11. 將Yaml反序列化爲c#對象
- 12. java將對象序列化爲ByteArray
- 13. 將接口對象序列化爲JSON
- 14. 將python對象序列化爲XML
- 15. 如何將對象序列化爲XDocument?
- 16. 將JSON序列化爲datetime.datetime對象
- 17. 將JSON對象反序列化爲類
- 18. 將JSON反序列化爲.net對象
- 19. 將JsonObjects反序列化爲.NET對象
- 20. 將對象序列化爲XML
- 21. 將對象序列化爲字符串
- 22. Jackson:將空對象序列化爲空
- 23. 序列化一個對象和反序列化爲對象
- 24. 將對象列表序列化爲java中的文件
- 25. JSON序列化和反序列化爲Flutter中的對象
- 26. 如何將C#中的Type類對象序列化並反序列化爲YAML?
- 27. 在C++中序列化對象並在mysql中存儲爲blob類型
- 28. 將Oracle行序列化爲XML
- 29. 無法將JSON對象數組反序列化爲C#對象
- 30. 在PHP中將多個對象序列化爲文件不能反序列化?
除非您編寫自己的結構化哈希算法,否則兩個哈希映射實例具有不同的哈希碼,無論其內容如何。這不是一個很好的解決方案,因爲它的脆弱,低效,並且以這種方式散列不允許用戶在數據庫中搜索hashmap的子集。 – Juliet 2008-12-17 00:51:10