JSF页面在多次重新加载时冻结

时间:2012-03-08 20:28:50

标签: java jsf javabeans threadpool

我使用此代码从数据库表中获取数据。

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;
    }

此代码是部署在glassfish服务器上的JSF页面的一部分。问题是,当我多次重新加载JSF页面(大约8次)时,网页会冻结。我怀疑线程池是填充的,并且没有新连接的空间。我怎么解决这个问题?查询完成后还是以其他方式关闭连接?

祝福

1 个答案:

答案 0 :(得分: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();
}

此外,您不应该在bean字段的getter方法中查询数据库。在每个请求期间可以多次调用getter。更优雅的方法是在构造函数或bean的@PostConstruct中准备DashboardList。