假如我封装了一个根据id从数据库获得name的方法,使用连接池,里面每次都进行数据库连接的打开和关闭操作。这样如果有一个循环调用对性能有没有很大影响?有没有必要把取连接放到外面?
public void biz() {
List<Object> beans = new ArrayList<Object>();
// 业务代码
// ..
for (int i = 0; i < beans.size(); i++) {
String Name = getNameById(beans.get(i));
}
// ..
} private String getNameById(Object object) {
Connection conn = null;
try {
// ...取连接用连接池
return null;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
}
}

解决方案 »

  1.   


    自己在本地粗略测试了一下。不关闭连接确实快点。但100万次密集查询简单数据操作,用org.apache.commons.dbcp.BasicDataSource每次取连接并关闭连接 和 取一次连接,最后关闭,相差能控制在1秒以内。
    但要注意,在取一次连接,用到最后再释放的情况下,需要显示调用Statement和ResultSet的关闭方法。要不然会因为这个连接占用大量Statement和 ResultSet而导致OutOfMemery(估计Apache的Connection的close方法里面给我们释放了这个Connection所占有的Statement和ResultSet) .
    在现在要求代码易读和可维护性很高的情况下,并且现实中一个线程访问数据库不可能那么频繁,我认为不需要取一次连接,作为参数在方法间传递,最后释放;只需要用连接池就足够了(其内部也是取一次连接,让不同的线程共用,最后再释放)。
      

  2.   

    Statement和ResultSet 这些用的时候是要关闭的,Connection就不用每次查询都打开关闭了,初始化几个,然后每次拿statement从初始化中拿。创建Connection是很耗资源的