【问题标题】:Exception SQL state [null]; error code [31]; The connection is closed: The connection is closed; nested exception is java.sql.SQLException异常 SQL 状态 [null];错误代码 [31];连接关闭:连接关闭;嵌套异常是 java.sql.SQLException
【发布时间】:2017-11-12 11:59:44
【问题描述】:

我们正在使用我们自己的数据源,它建立在 PoolDataSourceFactory 之上

<bean id="dataSource" class="oracle.ucp.jdbc.PoolDataSourceFactory"
      factory-method="getPoolDataSource" lazy-init="true" >
    <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/>
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="URL" value="${jdbc.url}" />
    <property name="connectionWaitTimeout" value="30" />
    <property name="minPoolSize" value="3"/>
    <property name="maxPoolSize" value="20"/>
    <property name="abandonedConnectionTimeout" value="300"/>
    <property name="inactiveConnectionTimeout" value="900"/>
    <property name="validateConnectionOnBorrow" value="true"/>
    <property name="exceptionManager" value="exceptionManager"/> 
</bean>

Tomcat 服务器日志:

2017-10-17 20:33:25,913 错误 [http-nio-8101-exec-4] u: - JdbcStoredProcedureWrapper.selectUserDetails: 无法执行存储过程:异常 [{}] org.springframework.jdbc.UncategorizedSQLException : CallableStatementCallback; SQL [{? = 调用 SP_NAME(?, ?, ?, )}]; SQL 状态 [null];错误代码 [31];连接关闭:连接关闭;嵌套异常是 java.sql.SQLException:连接已关闭:连接已在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate 的 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) 关闭(AbstractFallbackSQLExceptionTranslator.java:81) 位于 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1137) 的 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)。 jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1173) at org.springframework.jdbc.object.StoredProcedure.execute(StoredProcedure.java:142) at com.vodafone.gdsp.provisioning.dataaccess.jdbc.JdbcStoredProcedureCaller.execute( JdbcStoredProcedureCaller.java:561) 在 com.vodafone.gdsp.provisioning.dataaccess.jdbc.JdbcStore

如果有任何帮助,我会坚持这个问题

请帮我解决上述问题

【问题讨论】:

    标签: java spring-mvc oracle12c spring-jdbc


    【解决方案1】:

    经过一周的努力,我终于解决了这个问题:

    解决方案:游标很可能是基于全局临时表 (GTT) 打开的,该临时表是使用 ON COMMIT DELETE ROWS 选项创建的。 ORA-08103:对象不再存在错误的原因是紧跟在删除语句之后的提交语句。 DBA 团队不同意将 GTT 更改为提交保留行,所以最后我在 Java 服务层中添加了代码库[实现 Spring - 程序化事务],但忘记添加 transactionManager.rollback(status) int catch 块,这导致连接关闭错误。

    修复:

    包 com.test;

    import java.util.List;
    import javax.sql.DataSource;
    
    import org.springframework.dao.DataAccessException;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.TransactionDefinition;
    import org.springframework.transaction.TransactionStatus;
    import org.springframework.transaction.support.DefaultTransactionDefinition;
    
    public class StudentJDBCTemplate implements StudentDAO {
       private DataSource dataSource;
       private JdbcTemplate jdbcTemplateObject;
       private PlatformTransactionManager transactionManager;
    
       public void setDataSource(DataSource dataSource) {
          this.dataSource = dataSource;
          this.jdbcTemplateObject = new JdbcTemplate(dataSource);
       }
       public void setTransactionManager(PlatformTransactionManager transactionManager) {
          this.transactionManager = transactionManager;
       }
       public void create(String name, Integer age, Integer marks, Integer year){
          TransactionDefinition def = new DefaultTransactionDefinition();
          TransactionStatus status = transactionManager.getTransaction(def);
    
          try {
             String SQL1 = "insert into Student (name, age) values (?, ?)";
             jdbcTemplateObject.update( SQL1, name, age);
    
             // Get the latest student id to be used in Marks table
             String SQL2 = "select max(id) from Student";
             int sid = jdbcTemplateObject.queryForInt( SQL2 );
    
             String SQL3 = "insert into Marks(sid, marks, year) " + "values (?, ?, ?)";
             jdbcTemplateObject.update( SQL3, sid, marks, year);
    
             System.out.println("Created Name = " + name + ", Age = " + age);
             transactionManager.commit(status);
          } 
          catch (DataAccessException e) {
             System.out.println("Error in creating record, rolling back");
             **transactionManager.rollback(status);**
             throw e;
          }
          return;
       }
       public List<StudentMarks> listStudents() {
          String SQL = "select * from Student, Marks where Student.id=Marks.sid";
          List <StudentMarks> studentMarks = jdbcTemplateObject.query(SQL, 
             new StudentMarksMapper());
    
          return studentMarks;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-27
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多