2012-03-08 2 views
0

Я использую этот код для извлечения данных из таблицы базы данных.JSF-страница зависает, когда перезагружается много раз

public List<Dashboard> getDashboardList() throws SQLException { 

     if (ds == null) { 
      throw new SQLException("Can't get data source"); 
     } 

     //get database connection 
     Connection con = ds.getConnection(); 

     if (con == null) { 
      throw new SQLException("Can't get database connection"); 
     } 

     PreparedStatement ps = con.prepareStatement(
       "SELECT * from GLOBALSETTINGS"); 

     //get customer data from database 
     ResultSet result = ps.executeQuery(); 

     List<Dashboard> list = new ArrayList<Dashboard>(); 

     while (result.next()) { 
      Dashboard cust = new Dashboard(); 

      cust.setUser(result.getString("SessionTTL")); 
      cust.setPassword(result.getString("MAXACTIVEUSERS")); 


      //store all data into a List 
      list.add(cust); 
     } 

     return list; 
    } 

Этот код является частью страницы JSF, которая размещается на сервере Glassfish. Проблема в том, что когда я повторно загружаю страницу JSF много раз (примерно в 8 раз), веб-страница замерзает. Я подозреваю, что пул потоков заполнен и нет места для новых подключений. Как я могу решить проблему? Закройте соединение, когда запрос завершен или есть другой способ?

С наилучшими пожеланиями

+0

Не могли бы вы показать нам, как вы настраиваете этот источник данных? Это объединение в первую очередь? –

+0

Является ли этот код действительно частью вашей страницы jsf (так что вы используете JSP)? Или это часть бэк-бэнда? Если последний, каков объем боба? –

+0

Я сделал несколько снимков экрана конфигурации бассейна: http://imageshack.us/g/827/screenshotbg.png/ –

ответ

3

Прежде всего: Да, вы должны закрыть соединение, когда ваш сделано явным вызовом метода close(). Закрытие соединения освободит ресурсы базы данных.

ОБНОВЛЕНИЕ: И вы должны закрыть PreparedStatementclose()). Я также рекомендовал бы обрабатывать SQLExceptions в вашем методе, а не бросать его, так как вам нужно убедиться, что ваш оператор и соединение закрыты, даже если возникает исключение.

Что-то вроде этого:

Connection connection = dataSource.getConnection(); 
try { 
    PreparedStatement statement = connection.prepareStatement(); 
    try { 
     // Work with the statement 
    catch (SQLException e) { 
     // Handle exceptions 
} catch (SQLException e { 
    // Handle exceptions 
    } finally { 
     statement.close(); 
    } 
} finally { 
    connection.close(); 
} 

Кроме того, вы не должны запрашивать базу данных в методе получения полевого бин. В течение каждого запроса Getters можно вызывать несколько раз. Более элегантным способом было бы подготовить DashboardList в конструкторе или @PostConstruct вашего компонента.

+0

Если я правильно вас понимаю, я должен разместить @PostConstruct перед публичным списком getDashboardList() выдает SQLException {? –

+0

Нет, 'getDashboardList()' является getter для поля bean. Создайте новый метод, например. '@PostConstruc public void init()', где вы заполняете свой DashboardList. Затем получатель возвращает только заполненный список. –

+0

Теперь я получаю эту ошибку: ORA-00604: ошибка на рекурсивном уровне SQL 1 ORA-01000: превышены максимальные открытые курсоры ORA-01000: превышены максимальные открытые курсоры. Я закрыл связь с этим утверждением - con.close(); –

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