以前做Java数据库查询的时候都会按照许多书上的标准方法先建立一个数据库连接,然后在该连接上调用查询,使用完毕后立刻关闭连接。后来,觉得如果要频繁查询,那么就要不停地建立连接,关闭连接,很浪费资源。通常在这种情况下会使用连接池,这样多个查询就可以共享连接,而建立和关闭连接仅仅在程序开始和结束的时候才执行,大大提高了效率。
前几天做一个数据库查询的时候遇到了一个介于前面两种之间的情况,既需要频繁查询数据,但是又只需要一个连接。我在程序的开始建立一个连接,以后的查询代码如下:
PreparedStatement statement;
try{
//在此进行数据库操作
statement.close();
}
catch(Exception e){
System.err.println(e);
}
每个查询代码都是这样,因为同时不会有多个查询产生,所以我认为这样是正确的。如果在以上代码的“数据库操作”部分不会出错的话,这样的代码的确是正确的,但是如果出现异常,那么就不会执行statement.close()一句,于是在该statement依然占用着数据库连接,导致以后的查询都不能进行。这就需要我们正确地关闭该statement。参考了网上别人的做法之后,我使用了以下的代码:
PreparedStatement statement;
try{
//在此进行数据库操作
}
catch(Exception e){
System.err.println(e);
}
finally {
try{
statement.close();
}
catch(Exception e1){
System.err.println(e1);
}
}
finally里面的部分是始终都要执行的,所以把statement.close()一句放在finally里,而statement.close()本身也会抛出异常,所以又要使用一个try…catch语句。
这样的做法可以保证查询出错时仍然可以正确关闭statement,是比较好的做法。但是如果statement.close()时出错,那仍然会造成以后的查询不能执行,所以,最好的办法还是使用连接池来统一管理连接。