2013-07-09 2 views
0

Я столкнулся с исключением StaleConnectionException в своем приложении J2ee. Я изучал (и искал), и я нашел решение.WebSphere и 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; 
    } 

Мне не нравится это решение, потому что я первый лаг 6 секунд при первом вызове метода, если я должен управлять StaleConnectionException.

Я сделал обходное решение: проверьте соединение в начале нового сеанса браузера, но мне это тоже не нравится.

Есть что-то лучшее, что я могу реализовать?

Заранее спасибо.

Шарлатанство

ответ

0

Привет,
Я не слышал этого исключения, но не получил один. Это вряд ли может быть проблемой приложения. Вероятно, что-то не так с определением источника данных или настройками БД. Не могли бы вы предоставить дополнительную информацию?

1. WAS версия, OS/архитектура, DB поставщик/версия, драйвер JDBC используется
2. Настройки Datasource/пула соединений с WAS консоли администратора
3. стека исключений трассировки

Тем не менее, тем временем вы можете попытаться установить начальное количество подключений в пуле подключений на ноль, поэтому при его открытии открывается новое.

0

Я столкнулся с этой проблемой: в моем случае это произошло, когда подключение истекло на DB стороны, например, утром, когда первый пользователь подключиться к приложению. Фактически, минимальный размер пула соединений DB по умолчанию равен 1, поэтому последнее соединение, поддерживаемое пулом соединений, истекает. Решение заключалось в том, чтобы уменьшить его до 0 (WAS7/Oracle). Мы больше не сталкивались с этой проблемой.

Эта недвижимость находится в WAS консоли, Ресурсы> JDBC> Источники данных> [ваше имя DS]> свойства пула соединений

0

Я с этой проблемой в последнее время и нашел другое решение. Я думал, что я опубликую, если кто-то другой встретит эту тему. Объект java.sql.Connection содержит функцию isValid, которая будет подключаться к базовой базе данных. Это позволяет считать соединение недействительным и удаленным. Затем вы можете повторить соединение, как описано в IBM article.

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); 
1

Я получаю то же исключение для одного приложения. Я избавился от этой проблемы, выполнив следующие настройки в консоли администратора websphere.Я использую сервер приложений webphere 8.5. Аналогичные варианты должны быть доступны и для других версий.

Административная консоль -> Ресурсы -> JDBC -> Источники данных -> (Любой источник данных, который дает этот вопрос) - исходные свойства> WebSphere данных Application Server -> Проверить Validate новые соединения -> Проверить проверить существующие объединяют соединения -> Применить -> Сохранить -> Перезапустить сервер

Этот подход может занять много времени, но он избавился от исключения.

 Смежные вопросы

  • Нет связанных вопросов^_^