※ 引述《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 發表