2013-08-26 97 views
1

我有一個巨大的字符串,我需要在某處緩存,因爲我無法寫入文件,我唯一的選擇是將其作爲文本存儲在數據庫中,更多具體來說,在clob我有存儲JSON文件,我將壓縮的字符串放在該JSON對象的某個鍵下。壓縮一個字符串並將其作爲字符串存儲在數據庫中供以後解壓

我壓縮的字符串,但跨字符串操縱某處發生的事情,不允許我解壓縮數據,所以我想知道如果我應該將數據編碼到基礎64,但這將失去壓縮。

我能做些什麼來確保我可以將壓縮字符串存儲在數據庫中,以便以後可以取回它?

我不能更改數據庫,所以我堅持與CLOB場

這些都是我的壓縮功能:

public static String compress(String text) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     OutputStream out = new DeflaterOutputStream(baos); 
     out.write(text.getBytes("UTF-8")); 
     out.close(); 
    } catch (IOException e) { 
     //ooops 
    } 
    return baos.toString(); 
} 

public static String decompress(String bytes) { 
    InputStream in = new InflaterInputStream(new ByteArrayInputStream(bytes.getBytes())); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     byte[] buffer = new byte[8192]; 
     int len; 
     while ((len = in.read(buffer)) > 0) 
      baos.write(buffer, 0, len); 
     return new String(baos.toByteArray(), "UTF-8"); 
    } catch (IOException e) { 
     //ooops 
    } 
} 
+0

A * cache *用於限制檢索數據所需的工作量,以提高性能。壓縮並將其存儲在CLOB中會看出與此目標不一致。至少在我看來這是如此。 –

回答

1

不能任意的二進制數據轉換爲字符串而不被破壞。 。正如你已經說過的,如果你想將數據存儲在clob中,你需要對數據進行base64編碼(或者使用其他有效的二進制文本編碼)。

1

正如您發現的那樣,您無法將二進制數據存儲在CLOB中而沒有一些損壞,因此需要對文本進行編碼。

Base 64將平均增加33%的二進制數據的大小。所以你會失去一些壓縮,但是如果你的壓縮比率大於25%(對於特定類型的文本字符串,這通常很容易),那麼壓縮和基本64編碼可能會爲你提供淨存儲增益。很多CPU使用雖然.....

+0

謝謝大衛。你是對的 - 25%的壓縮比導致原始字符串的75%,當然還有1/3是100%,所以你只需要超過25%。我已經更新了我的答案。 – lreeder

0

你有沒有想過其他的解決方案,如使用memcached或其他緩存系統?或者你真的想榨取壓縮?

相關問題