关于如何节约数据库连接的讨论?

06-07-14 aill
在MVC模式中,DAO类封装了所有的数据操作,数据库连接的获取和释放都在这里执行,我一般都是在每个方法里获取和释放connect;但是涉及到复杂操作,例如批处理的时候,一下子要获取很多connect;连接池中的connect很容易就被占用光了;

还是举例来说明吧:

论坛帖子的数据库操作类

TopicDAO{
public void create(TopicDTO topic){
getConnection(....)
....
finally{ conn.close();}
}

public void remove(String id){
getConnection(....)
....
finally{ conn.close();}
}
}
上面remove方法是删除一个帖子,如果要批量删除N个帖子的话,
TopicDAO dao=new TopicDAO();
for(int a=0;a<vector.size();a++){
...
dao.remove(id);
}
<p>

用上面的操作执行,那么一次删除操作就创建和关闭了vector.size()个数据库链接; 这样妥当吗?

是否可以在DAO中增加一个批量删除的方法 removeList(String[] ids)

从而只使用一个connect就完成批量删除的操作

还有一个例子;

显示帖子; 帖子里要显示 帖子内容,帖子附件/图片,N个回复,N个回复的图片/附件;

正常操作:

TopicDAO tdao=new TopicDAO();
TopicDTO topic=tdao.findByKey(topicId);----1次连接

TopicImgDAO idao=new TopicImgDAO();
Vector topicImgV=idao.findAllImg(topicId);  -----1次连接

TopicResDAO rdao=new TopicResDAO();
Vector resList=rdao.getTopicRes(int start,int end,String topicId)----1次连接

ResImgDAO ridao=new ResImgDAO();
for(int a=0;a<resList.size();a++){
String resId=(String)resList.get(a);
 Vector resImgV=ridao.findAllImg(resId0;
}
-----------------------------resList.size()次连接

想一下,如果没页显示10个回复,那么显示一条帖子内容要创建13个数据库连接; 如果并发访问稍微多一点,你的连接池肯定罢工了!

如果要优化,我们可不可以在ResImgDAO里增加一个返回N条回复所有图片的方法呢,当然返回的可能就是HashMap等;

但是这样做是不是把业务的内容放到model里了呢?

当然还可以尝试其他方法,例如把connect传递给DAO的方法,DAO的方法判断connect是否为空,为空的时候才创建,但是这种做法太危险了;

小弟在这里开个头,希望各位大哥有什么好的思路或者方法给大家共享一下,大家一起讨论!

banq
2006-07-15 08:37
使用JDBC的批量处理语句

aill
2006-07-18 17:54
但是批处理好像只针对更新和删除吧,如果是查询怎么办呢?

blues
2006-07-19 12:30
应该不是问题阿,dao的1个方法中,会从pool获取连接,在操作完成后所调用的"conn.close()"应该是把conn放回pool.所以不会有频繁创建connection的问题. --频繁地从pool中取,放回pool,倒是真的,不过这个不是问题.

dingkui
2006-08-01 15:58
你看把connection作为参数传进DAO中合适不?这样的话只需要在调用dao的时候创建连接就可以了

猜你喜欢