We are using a specialized interceptor to free temperary clob/blob resource, it seems work fine now: <code> public class LobCleanUpInterceptor implements Interceptor { private static final Logger logger = Logger .getLogger(LobCleanUpInterceptor.class); // leave these method unchanged public boolean onSave(...) public boolean onLoad(...) public boolean onFlushDirty(...) public void onDelete(...) public void preFlush(...) public Boolean isUnsaved(...) public int[] findDirty(...) public Object instantiate(...) // a thread local set to store temperary LOBs private static final ThreadLocal threadTempLobs = new ThreadLocal(); // after flush(), clean all registered LOBs public void postFlush(Iterator entities) throws CallbackException { Set tempLobs = (Set) threadTempLobs.get(); if (tempLobs == null) { return; } try { for (Iterator iter = tempLobs.iterator(); iter.hasNext();) { Object lob = iter.next(); cleanIfBLOB(lob); cleanIfCLOB(lob); } } catch (SQLException e) { logger.fatal("clean LOB failed"+e.getMessage(), e); throw new RuntimeException(e); } finally { threadTempLobs.set(null); tempLobs.clear(); } } // free temperary clob resource private static void cleanIfCLOB(Object lob) throws SQLException { if (lob instanceof oracle.sql.CLOB) { oracle.sql.CLOB clob = (oracle.sql.CLOB) lob; if (clob.isTemporary()) { oracle.sql.CLOB.freeTemporary(clob); logger.info("clob cleaned"); } } } // free temperary blob resource private static void cleanIfBLOB(Object lob) throws SQLException { if (lob instanceof oracle.sql.BLOB) { oracle.sql.BLOB blob = (oracle.sql.BLOB) lob; if (blob.isTemporary()) { oracle.sql.BLOB.freeTemporary(blob); logger.info("blob cleaned"); } } } // register oracle temperary BLOB/CLOB into // a thread-local set, this should be called at // the end of nullSafeSet(...) in BinaryBlobType // or StringClobType public static void registerTempLobs(Object lob) { getTempLobs().add(lob); } // lazy create temperary lob storage public static Set getTempLobs() { Set tempLobs = (Set) threadTempLobs.get(); if (tempLobs == null) { tempLobs = new HashSet(); threadTempLobs.set(tempLobs); } return tempLobs; } } </code>