在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,但它沒有給出任何線索。我開始用盡想法...
我只是討厭Oracle驅動程序如何處理BLOB ... – 2009-10-20 20:45:03