异常SQL状态[null];错误代码 [31]; The connection is closed:连接关闭;嵌套异常是 java.sql.SQLException

Exception SQL state [null]; error code [31]; The connection is closed: The connection is closed; nested exception is java.sql.SQLException

我们正在使用我们自己的数据源,它建立在 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 SQL [{? = 呼叫 SP_NAME(?, ?, ?, )}]; SQL状态[空];错误代码 [31]; The connection is closed:连接关闭;嵌套异常是 java.sql.SQLException: The connnection is closed: The connection is closed at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1137) 在 org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1173) 在 org.springframework.jdbc.object.StoredProcedure.execute (StoredProcedure.java:142) 在 com.vodafone.gdsp.provisioning.dataaccess.jdbc.JdbcStoredProcedureCaller.execute(JdbcStoredProcedureCaller.java:561) 在 com.vodafone.gdsp.provisioning.dataaccess.jdbc.JdbcStore

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

请帮我解决以上问题

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

解决方案:很可能是基于全局临时 table(GTT) 打开了游标,该游标是使用 ON COMMIT DELETE ROWS 选项创建的。而 ORA-08103: object no longer exists 错误的原因是紧跟在 delete 语句之后的 commit 语句。 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;
   }
}