Страница JSF зависает при многократной перезагрузке - PullRequest
0 голосов
/ 09 марта 2012

Я использую этот код для извлечения данных из таблицы базы данных.

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 раз), веб-страница зависает Я подозреваю, что пул потоков заполнен и нет места для новых соединений. Как я могу решить проблему? Закрыть соединение, когда запрос завершен или есть другой способ?

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

1 Ответ

3 голосов
/ 09 марта 2012

Прежде всего: Да, вы должны закрыть соединение, когда закончите, явно вызвав метод 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();
}

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

...