【问题标题】:Statement Has Already Been Closed声明已关闭
【发布时间】:2015-08-08 14:38:56
【问题描述】:

我有一个问题,在开发服务器(运行 Weblogic 10.3.6)上,运行进程会导致:

 java.sql.SQLException: Statement has already been closed

所有数据库操作(主要是插入/更新)仍然发生并且看起来正确。但是,在我自己的工作站上的本地实例中运行不会触发该异常。

此代码应用运行 Spring 和 Hibernate,触发代码在程序化事务中运行。

谁能提供故障排除思路?

【问题讨论】:

  • 请包含堆栈跟踪以及触发此异常的代码。

标签: java spring hibernate jdbc weblogic


【解决方案1】:

另外,您必须注意关闭和初始化 Statment、ResultSet 和 Connection,这些问题可能会导致不良行为,例如,您可能会遇到这样的情况:

Connection conn = null;
PreparedStatement ps = null;

try {
   conn = getConnection ();
   for (TableBean tableBean : listTableBean) {
      ps = conn.prepareStatement ("INSERT INTO table (id, desc) values (?, ?)");
      ps.setInt (1, tableBean.getId());
      ps.setString (2, tableBean.getDesc());
      ps.executeUpdate();
   }
} catch (SQLException e) {
   e.printStackTrace();
} finally {
   try {
      if (ps != null) {
         ps.close();
      }
   } catch (SQLException e) {
      e.printStackTrace();
   } finally {
      try {
         if (conn != null) {
            conn.close();
         }
      } catch (SQLException e) {
         e.printStackTrace();
      }
   }
}

你可以看到,ps 在循环结束之前永远不会关闭,因此数据库可能会抛出超时错误,因为在这种情况下 数据库负责关闭会话。最好在必要时关闭会话。

 Connection conn = null;
 PreparedStatement ps = null;
 for (TableBean tableBean : listTableBean) {
    try {
       conn = getConnection ();
       ps = conn.prepareStatement ("INSERT INTO table (id, desc) values (?, ?)");
       ps.setInt (1, tableBean.getId());
       ps.setString (2, tableBean.getDesc());
       ps.executeUpdate();
    } catch (SQLException e) {
       e.printStackTrace();
    } finally {
       try {
          if (ps != null) {
             ps.close();
          }
       } catch (SQLException e) {
          e.printStackTrace();
       } finally {
          try {
             if (conn != null) {
                conn.close();
             }
          } catch (SQLException e) {
             e.printStackTrace();
          }
       }
    }
 }

希望这些信息对你有帮助

祝你好运。

【讨论】:

  • 问题是我使用的是 Spring/Hibernate 组合,而不是直接使用 JDBC。因此,所有的 Connection 和 Statement 工作都超出了我的掌控。
【解决方案2】:

如果您发布完整的堆栈跟踪,将很容易回答。但我会给你建议的解决方案。对于我的做法java.sql.SQLException: Statement has already been closed 意味着您的Statement 超时。当语句超时时,您将得到前面的异常。下面将帮助您如何配置Statement超时等。
http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html

【讨论】:

  • 通常这个错误意味着你在使用close()关闭语句后执行了一个操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多