我使用此代码从数据库表中获取数据。
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。