我們有一個可與IBM Informix,MySQL和Oracle運行的應用程序,並且我們使用Java和Hibernate連接到數據庫。我們將XML,CSV和其他基於文本的文件存儲在數據庫(clob列)中。 Java中的實體是byte[]
對象。Informix,MySQL和Oracle blob包含
對應用程序的一個功能請求現在是「grep」數據內的內容。所以我需要找到具有特定內容的所有文件。
在常規的char/varchar字段上,我可以使用like '%xyz%'
,但這不適用於byte []/blob。
第一種方法是加載每個實體,將byte[]
轉換爲字符串並在Java中使用contains
方法。如果用戶在其他(非clob)列上輸入任何過濾器參數,我將在測試clob之前應用這些過濾器,以減少我必須掃描的斑點數量。
對於100個文件(clobs)以及只要應用程序和數據庫位於同一臺服務器上,這種方式效果很好。但是,如果我在數據庫中有1.000.000個文件並且數據庫不總是在同一個網絡中,我認爲它會變得非常慢。所以我認爲這不是一個好主意。
我的下一個想法是創建一個數據庫過程。但我不確定這對Informix,MySQL和Oracle是否可行。我不確定這是否可能。
最後一個但並不喜歡的方法是將數據內容存儲在clob中。也許我可以使用不同的數據類型呢?
有沒有人有一個好主意如何認識到這一點?我需要爲所有三個DBMS提供解決方案。應用程序知道它連接到什麼類型的DBMS。所以如果我有三種不同的解決方案(每個DBMS一個),那就沒問題了。
我完全開放以改變我使用的數據類型(BLOB,CLOB ...) - 我可以根據需要修改它。
注意:clobs範圍從大約5 KiB到大約500 KiB,最大1 MiB。
每個BLOB/CLOB對象有多大? KiB,MiB,GiB,更大?對象越多,它們越多,將每個對象返回給客戶端代碼以查看是否應該使用對象就越糟糕 - 所以您有權擔心。確保過濾完成服務器端將是至關重要的。 –
每個條目將大約5kb到500kb。每個文件最多1MB。如果使用過程中輸入任何過濾器參數,我將過濾以減少我必須掃描的斑點數 – Hauke
大多數數據庫都具有某種功能,用於對非結構化文本數據進行自由格式Google搜索。由於數據不是二進制數據,你幾乎肯定希望將數據存儲在clob列而不是blob中。然後,您將構建某種文本索引(在Oracle中,您正在尋找的功能是Oracle Text)。但是每個數據庫的實現將會是相當獨特的,這不是你要用ANSI標準SQL查詢的東西。 –