精華區beta Programming 關於我們 聯絡資訊
※ 引述《lobnqii@kkcity.com.tw (lobnqii)》之銘言: > 了解您的意思!但所說有瑕疵。 > (1) connection idel 並不代表是佔用資源,這要分連線物件是屬於區域 > 或全域而定。只有在區域物件之狀況下,才算是佔用資源。 抱歉..本人指的是佔用 Sql Server的資源 並不是指App的資源 如果Sql Server上有"一堆"閒閒沒事的使用者連線 就是佔用資源,應該要避免 > (2) 連線中斷之後B,C是否仍有機會執行的問題就更複雜。 這裡可能您也誤會了 小弟指的並不是因中斷而停止連線 而是指"Exception"的發生而中斷 當然是用try catch去包起來 這樣就能確保B與C的工作正常 當然如果遇到您說的狀況(服務中斷) B與C當然就無法順利執行了 > 首先要了解中斷的原因是什麼? > a.連線的中斷 >    這種中斷方式,是無論是否有開開關關或一直開著不關都是同樣的 >    結果。皆必須等connection time out之後,才可續連線。這個事件 > 是屬於未連線前而正準備連線上所產生。 > b.因為command而中斷的連線 > 當已連線之後,若因中途不明因素在一道command之後而發現中斷連線 >    狀況,這種情況比較多見於網頁程式,通常是服務太多而導致time out >    。這類的中斷,並不算是真的連線中斷,只是查詢逾時的中斷。對於是 > 否可得推導出應開開關關的結果並非正比亦非必要。因為是命令中斷而 > 不是真正的連線中斷之故。 > 若中斷情形是真正的連線中斷,在目前通用資料庫為MS SQL/MySQL/Oracle > 的狀況下,那大約不是作業系統(web server)掛掉就是資料庫已掛掉了, 因"Exception"產生的中斷原因就可能很多了 並不見得是服務中斷,..就連sql command下錯,或是資料格式,型態等等有錯誤 甚至是沒有確保資料的"完整性"都有可能會發生這種事 > 這時候開開關關也沒有必要性。 > 微軟的立場就像政府的立場,很多時候是在說一些免責、沒有必要的話。在實務 > 上,我很少碰到有連線中斷的狀況,中斷的狀況大都只是查詢失敗的命令中斷而 > 已,但在教育手冊中還是都會提及遇中斷須再進入一次。 > 所以,要開開關關的需求並沒想像中的必要。何況,對於連線時之命令使用,皆 > 會先判斷這一次的查詢是否有效。而有效的查詢是必經connection & recordset > 的有效性判斷後才進行。若是失敗,就要程式自己去啟動再次的連線,在這種機 > 制下就更沒有必要開開關關的,只需在失敗時再開一次(這個機制是在判斷查詢 > 是否有效的函式中控制) > 更何況,實際上每開一次連線也需要一段時間,而且程式也不夠簡潔,當然,若 > 硬體設備強捍,自己也不嫌多打幾行程式,堅持一定要開開關關也是無妨。 > 不過,recordset 倒是有必要考慮開關。這視這個物件是放在全域還是區域,以 > 及同樣視窗是否可以同時多啟,以及同系統不同視窗是否允許同時多啟而定。因 > 為區域性recordset有時會因為掃過許多的table而鎖住資料庫某些table & rows > (依transaction level而定,我曾在三年前遇到一位多年物流經驗的專案經理, > 還不知道何謂transaction level...=.=),所以若不在結束使用時釋放,則不只 > 是浪費硬碟或RAM空間,同時也影響到後續查詢的使用(許多dead lock就是這樣產 > 生的)。 > 若recordset是全域物件,就須注意在多視窗之下會被後視窗中的查詢抹除,至於 > connection物件因為只開一次(我的方式)所以不會有這種情況發生。 > 結論: > 想要在每支程式中開關connection亦無不可,但我本人依多年實務經驗不會選 > 擇這個方式 一個design pattern不能完全適用所有的狀況 簡潔的程式也未必一定是好程式 開開關關的機制之前提過了,在ADO.Net有Connection Pool在處理 目的是為了節省"資源" ...當然這個資源先前沒說清楚是Sql Server的資源 "如果"..connection從頭開到尾是最省資源的方式,那connection pool存在的目的是? 小弟不知貴兄多年專案是那個領域的,不過小弟有個疑惑 如果有台Sql server不要說千人..百人就好..有百人佔著connection 這樣比較省資源 還是當使用到connection時,由connection pool去管理connection資源 當有須要Query時才"打開"連線 (是打開,不是建立...這在connection pool是不同的) 比較省?! 百人連線能確定"使用中"的有多少?"Idel"中的應該是佔大多數吧 由其以瀏覽資料為取向的功能時....大多數時間使用者都在"瀏覽" Query出的"資料" 但此時確"佔著"connection不放....(此時在Sql server看看使用者list就知道..恐怖) 但也或許connection pool的方法不適用於貴兄的專案狀況 而且無論是開開關關或是一直開著都不會改變程式執行的結果 但本人提出"開開關關"的觀念是習自MSDN對於ADO.Net 的connection pool機制 還有一個觀念是..."開開關關"在有connection pool 是為了節省資源與增加效能 但...如果把pool給關了,或pool的數量不設定不符需求...那效能只能用慘字形容 -- Origin: 幽谷˙反地球聯邦組織 aeug.twbbs.org Author: GP03 zanka.idv.tw 發表