保存 blob 时连接关闭

Connection closed when saving blob

我在 weblogic 应用程序上上传文件时遇到问题。

文件上传器完成保存文件后,出现以下异常:

java.sql.SQLException: Conexión cerrada
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445)
at oracle.sql.BLOB.getDBAccess(BLOB.java:882)
at oracle.sql.BLOB.freeTemporary(BLOB.java:584)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.close(OracleLobHandler.java:412)
at org.springframework.jdbc.support.lob.SpringLobCreatorSynchronization.afterCompletion(SpringLobCreatorSynchronization.java:76)
at org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCompletion(TransactionSynchronizationUtils.java:133)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.invokeAfterCompletion(AbstractPlatformTransactionManager.java:951)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCompletion(AbstractPlatformTransactionManager.java:926)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:319)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy74.guardarFichero(Unknown Source)

在其他环境下没有出现这个问题,所以我认为这一定是JDBC驱动程序上的一些配置,但我不确定我必须修改哪个。

调用struts

    private void adjuntarFichero()throws Exception {
    logger.debug("uploadFileName = "+uploadFileName);       
    if (uploadFileName!=null && !uploadFileName.equals("")) {
        HttpSession session = request.getSession();
        HashMap<Long,String> ficheros = (HashMap<Long,String>)session.getAttribute("ficheros");
        if (ficheros == null) ficheros = new HashMap<Long,String>();

        Fichero file = new FicheroImpl();
        file.setNombre(uploadFileName);
        file.setFichero(getBytesFromFile(upload));
        file = gestorFichero.guardarFichero(file);

        ficheros.put(file.getId(), uploadFileName);
        session.setAttribute("ficheros", ficheros);
    }        
}  

错误是在 "guardarFichero" 方法内部产生的,该方法调用了负责保存的 DAO class

public 摘要 class gestorFichero 扩展 org.springframework.orm.hibernate3.support.HibernateDaoSupport{

public Fichero guardarFichero (Fichero fichero){
    Debug.prec(fichero, "El fichero no puede ser nulo");
    return (Fichero)create(TRANSFORM_NONE, fichero);
}   
public java.lang.Object create(final int transform, final    com.aena.sgc.Fichero fichero)
{
    if (fichero == null){
        throw new IllegalArgumentException("Fichero.create - 'fichero' can not be null");
    }
    this.getHibernateTemplate().save(fichero);
    return this.transformEntity(transform, fichero);
}

最后我发现了问题所在。

这与驱动程序有关class。最初我们将数据源配置为使用 XA 驱动程序 oracle.jdbc.xa.client.OracleXADataSource 并且每当我们完成上传文件时,就会抛出异常。

一旦我将驱动程序更改为 oracle.jdbc.OracleDriver,这些错误就消失了。