假如我封装了一个根据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) {
}
}
}
}
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) {
}
}
}
}
解决方案 »
- 求助:java解析XML文件的问题
- 急!请各位高手帮帮忙
- 高手门求救啊!JBuilder2006,由于我卸载从装的原因~现在装上运行不起来。高分求!
- 关于数字转中文的问题
- jstl的问题
- 维修工程师,JAVA程序员我应该选择哪一个?
- 在线视频格式转换问题,请教大虾(java runtime exec mencoder)问题
- java+ibatis+spring存储过程的简单问题
- jreport与oracle数据库配置在哪里写的?
- Hibernate: 数据库的主键是char型的,PO该怎么写呀?
- 新手弄java 怎么办?
- Data truncation: Data truncated for column 'sqDate' at row 1求高手解惑!
自己在本地粗略测试了一下。不关闭连接确实快点。但100万次密集查询简单数据操作,用org.apache.commons.dbcp.BasicDataSource每次取连接并关闭连接 和 取一次连接,最后关闭,相差能控制在1秒以内。
但要注意,在取一次连接,用到最后再释放的情况下,需要显示调用Statement和ResultSet的关闭方法。要不然会因为这个连接占用大量Statement和 ResultSet而导致OutOfMemery(估计Apache的Connection的close方法里面给我们释放了这个Connection所占有的Statement和ResultSet) .
在现在要求代码易读和可维护性很高的情况下,并且现实中一个线程访问数据库不可能那么频繁,我认为不需要取一次连接,作为参数在方法间传递,最后释放;只需要用连接池就足够了(其内部也是取一次连接,让不同的线程共用,最后再释放)。