1

我在 J2ee 应用程序中遇到了 StaleConnectionException。我已经研究(并搜索)并找到了解决方案。

这里是。

  public static Connection getConnection() {
    Connection conn = null;

    try {
      if (ds == null) ds = (DataSource) new Utility.makeLookup();
      conn = ds.getConnection();
      conn.setAutoCommit(false);

      //  Check quality of return connection
      Statement stmt = conn.createStatement();
      stmt.executeQuery("Select 1 from dual");
      stmt.close();

    } catch (Throwable t) {
        try {
          //  Recovery
          ds = (DataSource) new Utility.makeLookup();
          conn = ds.getConnection();
          conn.setAutoCommit(false);
          return conn;
        } catch (Throwable t2) { /* RIP */ }
    }

    return conn;
  }

我不喜欢这个解决方案,因为如果我必须管理 StaleConnectionException,我在第一次方法调用时会有 6 秒的第一延迟。

我做了一个解决方法:在新的浏览器会话开始时测试连接,但我也不喜欢这样。

我可以实施更好的东西吗?

先感谢您。

嘎嘎

4

5 回答 5

2

我在一个应用程序中遇到了同样的异常。我通过在 websphere 管理控制台中进行以下设置解决了这个问题。我正在使用 webphere 应用程序服务器 8.5。其他版本也必须提供类似的选项。

管理控制台 -> 资源 -> JDBC -> 数据源 ->(出现此问题的任何数据源)-> WebSphere Application Server 数据源属性 -> 检查验证新连接 -> 检查验证现有池连接 -> 应用 ->保存 -> 重启服务器

这种方法可能有点耗时,但它摆脱了异常。

于 2015-12-17T09:52:19.513 回答
0

我遇到了这个问题:在我的情况下,它发生在数据库端的连接超时时,例如早上第一个用户连接到应用程序时。实际上DB连接池的最小大小默认是1,所以这个连接池维护的最后一个连接超时了。解决方案是将其减少到 0 (WAS7/Oracle)。我们不再面临这个问题。

此属性位于 WAS 控制台中,资源 > JDBC > 数据源 > [您的 DS 名称] > 连接池属性

于 2014-04-28T10:14:06.953 回答
0

我最近一直有这个问题,并找到了另一个解决方案。我想如果其他人遇到这个线程,我会发布。java.sql.Connection 对象包含一个isValid函数,它将与底层数据库建立连接。这允许连接被视为无效并被删除。然后,您可以按照IBM 文章中的描述重试连接。

Context ctx = null;
DataSource dataSource = null;
Connection conn = null;
boolean retry = false;
int numOfRetries = 0;

do
{
  try
  {
    ctx = new InitialContext();
    dataSource = (DataSource) ctx.lookup("My Database");
    conn = dataSource.getConnection();

    // Make sure this connection is valid before continuing
    // This connection could be from the connection pooled 
    //   and the underlying db connection could be closed.
    if (conn.isValid(5) == false)
    {
      throw(new java.sql.SQLException("INVALID_CONNECTION"));
    }

    retry = false;
  }
  catch (Exception ex)
  {
    if (numOfRetries < 2)
    {
      retry = true;
      numOfRetries++;

      // Sleep for one second before retry
      Thread.sleep(1000);
    }
    else
    {
      retry = false;

      throw (ex);
    }
  }
} while (retry == true);
于 2014-09-12T16:14:42.107 回答
0

IBM 网站上有一个故障排除页面。也许这会有所帮助。

他们提到捕获 StaleConnectionException 并重试。他们还提供了一个如何做到这一点的例子。

http://www-01.ibm.com/support/docview.wss?uid=swg21247168#SCETroubleshooting

于 2013-11-25T12:45:00.597 回答
0

嗨,
我听说过这个例外,但从未遇到过。这几乎不可能是应用问题。数据源定义或数据库设置可能有问题。那么您能否提供更多信息?

1. WAS 版本、操作系统/架构、数据库供应商/版本、使用的 JDBC 驱动程序
2. WAS 管理控制台的数据源/连接池设置
3. 异常堆栈跟踪

但是,与此同时,您可以尝试将连接池中的初始连接计数设置为零,以便在询问时打开一个新连接。

于 2013-07-18T15:40:56.110 回答