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

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页面的一部分。问题是,当我多次(大约8次)重新加载JSF页面时,网页冻结了。我怀疑线程池已满,没有空间用于新连接。我该如何解决这个问题?查询结束或有其他方法时关闭连接?

最良好的祝愿

最佳答案

首先:是的,完成后,应通过显式调用close()方法来关闭连接。关闭连接将释放数据库资源。

更新:并且您也应该关闭PreparedStatement(使用close())。我还建议您在方法中处理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。

07-24 15:38