我为一个问题挣扎了好几个月。我需要从数据库中复制一组对象/文件,并将其保存为新示例。例如,一个学生实体有许多依赖实体。所有依赖实体中都有这么多文件。因此,我创建了对象的副本并调用repositiry.save()。如果成功,整个保存过程最多需要40分钟。但在一些随机运行中
java.io.IOException: Closed Connection
at oracle.jdbc.driver.OracleBlobInputStream.needBytes(OracleBlobInputStream.java:204)
at oracle.jdbc.driver.OracleBufferedStream.readInternal(OracleBufferedStream.java:169)
at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:143)
at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:132)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1158)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:878)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1135)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:854)
at com.*.*.*.*.hibernate.BlobUserType.nullSafeSet(BlobUserType.java:209)
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:160)
nullsafeset方法如下所示
@Override
public void nullSafeSet(PreparedStatement ps, Object value, int index, SharedSessionContractImplementor session)
throws HibernateException, SQLException {
if (value == null) {
ps.setNull(index, Types.BLOB);
} else {
if (value instanceof FileUploadBlob) {
FileUploadBlob fileUploadBlob = (FileUploadBlob) value;
InputStream inputStream = fileUploadBlob.getBinaryStream();
DatabaseMetaData dbMetaData = session.connection().getMetaData();
String dbProductName = dbMetaData.getDatabaseProductName();
if (dbProductName.toUpperCase().contains("ORACLE")) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
IOUtils.copy(inputStream, baos);
InputStream is = new ByteArrayInputStream(baos.toByteArray());
ps.setBlob(index, is); // assume JDBC 3.0
inputStream.close();
baos.close();
} catch (IOException e) {
LOG.error("Clone process interrupted due to IOException thrown :", e);
} catch (Exception e) {
LOG.error("Clone process interrupted due to Exception thrown :", e);
}
}
} else if (value instanceof Blob) {
ps.setBlob(index, (Blob) value);
} else {
LOG.warn("Unknown BLOB type");
}
}
}
我改变了很多配置,什么都没用。
现在,作为控制器的一个解决方法,我捕获了异常并尝试保存同一个对象(保存失败)
引起错误
org.hibernate.staleobjectstateexception:行被另一个事务更新或删除(或者未保存的值Map不正确)
我必须重新保存这张唱片。我怎么能那样做。如何回滚上一个。我是冬眠的初学者。我真的在努力解决这个问题。请帮忙
暂无答案!
目前还没有任何答案,快来回答吧!