精華區beta Programming 關於我們 聯絡資訊
※ 引述《lobnqii@kkcity.com.tw (lobnqii)》之銘言: > 也許MSDN有它不為人知的理由,但想想,您進入一個系統中的每一頁皆要開關 > 一次,這樣有效率嗎? 理由就是...不希望每一個使用者佔用connection太久 至於效率的問題,在這方面就透過connection pool 來彌補 > 我的作法是登入後就打開一個connection,並指定給一個全域變數,以後就每 > 一支程式就使用該全域變數即可,至使用者登出才關閉。 這樣的話,既使在idel中也佔用的connection資源 尤其是一道指令明明不到一秒就結束 可以把connection資源讓給別人用 確不放開還一直佔用,就是資源浪費 這就是為何MSDN要這樣做的原因"之一" 當然還有其他原因啦... 舉個例說,假如A,B,C三道command要分別執行 如果是在最前面把connection打開然後執行A,B,C這種情況 假若執行到A發生例外狀況,導致連線中斷,那B跟C就執行不到了 但假如是在執行前才打開連線,那既使A失敗,B,C仍有機會成功執行 對於除錯也是比較好進行 當然還有其他理由啦... > 若是資料庫版權不足,以上的方式是最佳方案,讓所有使用者之查詢就在佇列 > 中排隊,通常一個新增、更新指令不過幾毫秒,所以排隊不會很久。 > 倒是select的語法會佔許多時間及硬體空間。比較新型的資料庫例如 > MS SQL 2000,Oracle等,用select所「掃過」的表格(tables)及資料列(rows) > 會「鎖住」(這裡視transaction level而定,共四級可在MSDN中查到),所以 > 用select之後要趕快把資料處理掉,不然人一多,那可能導致尾端的人 > over time. > 同時,在使用前要block (adoCnn.BeginTrans),結束後要release(adoCnn. > CommitTrans),這樣資料在使用中途才不會被其它人插花。 > 通用(Ansi SQL 89,92)簡例: > sSQL="select * from Test where fTest =..." > adoCnn.BeginTrans > set rsTemp=adoCnn.Execute(sSQL) > if RSIsNormal(rsTemp) then > sSQL=" insert into Test(...) values(...)" > adoCnn.Execute sSQL '此處不能有括號 > else > ..... > end if > adoCnn.CommitTrans > function RSIsNormal(rsResult) > ... > end function > 祝如意 -- Origin: 幽谷˙反地球聯邦組織 aeug.twbbs.org Author: GP03 zanka.idv.tw 發表