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

1 つのアプリケーションで同じ例外が発生していました。websphere管理コンソールで以下の設定を行うことで問題を解決しました。Webphere アプリケーション サーバー 8.5 を使用しています。他のバージョンでも同様のオプションを使用できる必要があります。

管理コンソール -> リソース -> JDBC -> データ ソース -> (この問題を引き起こしているデータ ソース) -> WebSphere Application Server データ ソース プロパティ -> 新しい接続の検証をチェック -> 既存のプールされた接続の検証をチェック -> 適用 ->保存 -> サーバーの再起動

このアプローチは少し時間がかかる可能性がありますが、例外を取り除きました。

于 2015-12-17T09:52:19.513 に答える
0

私はこの問題に直面していました:私の場合、最初のユーザーがアプリケーションに接続した朝など、DB側で接続がタイムアウトしたときに発生しました。実際、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 Web サイトにあります。おそらくそれが役立つでしょう。

彼らは、StaleConnectionException をキャッチして再試行することについて言及しています。また、その方法の例も示しています。

http://www-01.ibm.com/support/docview.wss?uid=swg21247168#SCEトラブルシューティング

于 2013-11-25T12:45:00.597 に答える