關於如何節約資料庫連線的討論?

aill發表於2006-07-14
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 class="indent">



用上面的操作執行,那麼一次刪除操作就建立和關閉了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是否為空,為空的時候才建立,但是這種做法太危險了;

小弟在這裡開個頭,希望各位大哥有什麼好的思路或者方法給大家共享一下,大家一起討論!

相關文章