2008-12-16 28 views
1

我有一個HashMap,我正在序列化和反序列化爲Oracle數據庫,在BLOB數據類型字段中。 我想使用此字段執行查詢。 例如,應用程序將創建一個新的HashMap,並且有一些鍵值對。 我想查詢數據庫,看看這個數據的HashMap是否已經存在於數據庫中。 我不知道如何做到這一點,似乎很奇怪,如果我必須去db中的每個記錄,反序列化它,然後比較,SQL處理比較BLOBs,所以我可以... select * from processesES where foo =?....和foo是一個BLOB類型,並且?是新的HashMap的一個實例? 謝謝將對象序列化爲Oracle中的BLOB

回答

4

這裏有一篇文章供您閱讀: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 = ? 
1

我可以不同意,但我被告知這樣做。 我很欣賞你的解決方案,這就是我以前的樣子。 感謝

2

在數據庫中存儲序列化對象是幾乎總是一個壞主意,除非你提前知道的時候,你不需要對查詢他們。

你是如何序列化HashMap的?有很多方法可以序列化數據和像HashMap這樣的對象。比較兩個地圖,特別是序列化的地圖,並不是微不足道的,除非你的序列化技術保證兩個等價的地圖總是以相同的方式序列化。

解決這個問題的一種方法是對一些很少需要查詢的對象使用XML序列化。例如,在我工作的地方,我們有一個日誌表,其中某個日誌消息作爲XML文件存儲在CLOB字段中。這個XML數據表示一個序列化的Java對象。通常我們會查詢記錄中的其他列,並且只能以單個原子步驟讀/寫blob。然而,有一次或兩次需要對blob進行深入檢查,並使用XML來允許這種情況發生(Oracle支持在varchar2或CLOB字段以及本機XML對象中查詢XML)。如果謹慎使用,這是一項有用的技術。

2

調查dbms_crypto.hash來製作你的blob的散列。將散列存儲在blob旁邊,它會給你一些東西來縮小搜索範圍,使之更易於管理。我不推薦存儲哈希映射,但這是搜索斑點之間精確匹配的通用技術。 另請參見SQL - How do you compare a CLOB

+0

除非您編寫自己的結構化哈希算法,否則兩個哈希映射實例具有不同的哈希碼,無論其內容如何。這不是一個很好的解決方案,因爲它的脆弱,低效,並且以這種方式散列不允許用戶在數據庫中搜索hashmap的子集。 – Juliet 2008-12-17 00:51:10

0

Oracle可以使用Java定義新的數據類型(或Windows上的.net),您可以爲序列化對象定義數據類型並定義查詢如何處理它。

缺乏好,如果你試試這個...

0

如果您的序列數據,XML,並將數據存儲在XML,那麼你可以在你的SQL查詢中使用的XPath。 (對不起,因爲我更多的是SqlServer的人,我不知道如何做到這一點Oracle中的細節。)

  • 如果你每天只需要更新序列化的數據的部分不做這個。
  • 同樣,如果任何數據是由其他數據指向或指向其他數據不這樣做。