Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So behalten Sie GROSSE BLOBs (> 100 MB) in Oracle mit Hibernate bei

Ich hatte die gleichen Probleme wie Sie beim Versuch, eine Karte mit dem Typ "Blob" zu erstellen. Hier ist ein Link zu einem Beitrag, den ich auf der Hibernate-Site erstellt habe:https://forum.hibernate.org/viewtopic.php?p=2452481#p2452481

Ruhezustand 3.6.9
Oracle-Treiber 11.2.0.2.0
Oracle-Datenbank 11.2.0.2.0

Um das Problem zu beheben, habe ich Code verwendet, der einen benutzerdefinierten UserType für das Blob hatte, ich hatte den Rückgabetyp java.sql.Blob.

Hier sind die wichtigsten Methodenimplementierungen dieses Benutzertyps:

public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {

   Blob blob = rs.getBlob(names[0]);
   if (blob == null)
      return null;

   return blob;
}

public void nullSafeSet(PreparedStatement st, Object value, int index)
     throws HibernateException, SQLException {
   if (value == null) {
      st.setNull(index, sqlTypes()[0]);
   }
   else {
      InputStream in = null;
      OutputStream out = null;
      // oracle.sql.BLOB
      BLOB tempBlob = BLOB.createTemporary(st.getConnection(), true, BLOB.DURATION_SESSION);
      tempBlob.open(BLOB.MODE_READWRITE);
      out = tempBlob.getBinaryOutputStream();
      Blob valueAsBlob = (Blob) value;
      in = valueAsBlob.getBinaryStream();
      StreamUtil.toOutput(in, out);
      out.flush();
      StreamUtil.close(out);
      tempBlob.close();
      st.setBlob(index, tempBlob);
      StreamUtil.close(in);
   }
}