我使用此代码从数据库表中获取数据。
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次)时,网页会冻结。我怀疑线程池是填充的,并且没有新连接的空间。我怎么解决这个问题?查询完成后还是以其他方式关闭连接?
祝福
答案 0 :(得分:3)
首先:是的,您应该在完成后通过显式调用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。