2009-10-20 12 views
0

在Weblogic 10下,我使用Hibernate將數據存儲到包含BLOB的多個表中。它一直運行良好,但客戶發現了15%的BLOB具有正確大小但只包含空字符的特定情況。我無法弄清楚是什麼使它變得好或充滿空虛。Blob進入Oracle:大約15%被填充 00

我使用的BLOB類型做了:

public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException { 
    if (value == null) { 
     st.setNull(index, sqlTypes()[0]); 
     return; 
    } 

    try { 
     Connection conn = st.getConnection(); 
     if (conn instanceof org.apache.commons.dbcp.DelegatingConnection) { 
      log.debug("Delegating connection, digging for actual driver"); 
      conn = ((org.apache.commons.dbcp.DelegatingConnection)st.getConnection()).getInnermostDelegate(); 
     } 
     OutputStream tempBlobWriter = null; 
     BLOB tempBlob = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION); 
     try { 
      tempBlob.open(BLOB.MODE_READWRITE); 
      tempBlobWriter = tempBlob.setBinaryStream(1L); 
      tempBlobWriter.write((byte[])value); 
      tempBlobWriter.flush(); 
     } finally { 
      if (tempBlobWriter != null) 
       tempBlobWriter.close(); 
      tempBlob.close(); 
     } 

     st.setBlob(index, (Blob) tempBlob); 
    } catch (IOException e) { 
     throw new HibernateException(e); 
    } 
} 

我把日誌在那裏,我們可以確認值(byte [])是不錯的。我試圖改變createTemporary參數,但沒有成功。

我正在使用捆綁的Oracle Thin驅動程序在Weblogic 10.0下運行此操作(無法升級)。

一個線索是工作調用來自WLS部署和管理的標準Web服務。但是有問題的調用是通過一個線程來完成的,該線程與使用JNI與一些遺留系統進行交互的組件一起開始。除了這些BLOB之外,這個線程對所有的東西都很有用。在插入數據並稍後關閉之前,我正在獲得一個新會話。 (會話在線程的整個生命週期中不會保持打開狀態)

我已經將Hibernate日誌級別設置爲DEBUG,但它沒有給出任何線索。我開始用盡想法...

回答

1

問題解決了。

其實,我是這樣做的:

  • 公開會議
    • 打開事務
      • 擺脫舊系統的第一個項目
      • 寫第一個項目數據庫(BLOB)
    • close t ransaction
    • 打開事務
      • 從遺留系統獲得第二項
      • 寫入到數據庫中第二個項目(BLOB)
    • 接近交易
    • ...直到遺留系統有沒有更多的過程
  • close session

這通常會每輪處理1到5件物品。

但是由於Oracle驅動程序不使用JDBC中處理blob的標準方式,我們的自定義類型必須創建存儲在會話中的臨時blob。顯然,當你在同一會話中的不同交易中插入斑點時,它們往往會干擾並導致我的問題。

我通過在每次提交後關閉會話來解決它。我不喜歡它,但我認爲它是Oracle驅動程序的錯。

+0

我只是討厭Oracle驅動程序如何處理BLOB ... – 2009-10-20 20:45:03