2010-06-11 28 views
2

當使用Hibernate查詢具有Blob(OID類型)的某些記錄Postgres 8.4時,我遇到了這個奇怪的情況。該查詢不會返回沒事,但是當我的代碼要讀取BLOB與下面的簡單代碼的內容,它得到0字節後面Postgresql 8.4用Hibernate讀取OID樣式BLOBs

public static byte[] readBlob(Blob blob) throws Exception { 
    InputStream is = null; 
    try { 
     is = blob.getBinaryStream(); 
     return org.apache.commons.io.IOUtils.toByteArray(is); 
    } 
    finally { 
     if (is != null) 
      try { 
       is.close(); 
      } 
      catch(Exception e) {} 
    } 
} 

搞笑想到的是,我只得到了,因爲我已經此行爲開始向表格中添加多個這樣的記錄。 底層的JDBC庫是類型3(postgresq 8.4-701)。 有人可以告訴我如何解決這個問題? 感謝

彼得

+0

如果你都拿到6個字節回來,那麼我會說,你正在閱讀的OID,0字節可能意味着OID爲空,或者blobdata實際上只有0字節長。嘗試休眠3.6順便說一句。 – Justin 2010-09-22 19:25:41

回答

0

這是一段時間,因爲我遇到了類似的問題,因爲我已經刷新這個話題我想共享成果的回憶。問題是Postgres(以及Oracle的一些版本)不會在創建記錄時在同一事務中處理Blob內容。有趣的想法是,需要在外部文件(最終存儲內容的地方)之後傳遞內容的內容已經很好地創建並保留用於操作。是的,記錄被創建,但Blob是空白的。要讓Blob填寫任何需要輸入的內容,您需要在第二個事務中執行該操作(更新記錄)。這是一個有趣的業務(可能是重大的bug),外置熱交換器

+1

PostgreSQL絕對支持處理主事務內的斑點。這就是在數據庫中使用blob的全部原因。我不知道Hibernate,雖然... – 2010-06-13 10:27:56

+0

我已經調試到JDBC客戶端級別調用什麼。在我看來,在某些情況下,要存儲的內容是有限的,與Blob的交易在拍攝時沒有問題。但通過一定的門檻,交易不會去。它可能與我尚未意識到的Postgres配置設置有關。不過謝謝你的評論 – 2010-06-18 10:20:50