推 Peruheru: 連線無所謂吧,是寫入才比較有lock的問題 12/25 13:34
→ Peruheru: 多開幾條連線應該不會怎樣...吧 12/25 13:36
當多開連線時,連線過多server會將連線踢掉,
要是這時候執行指令,會導致錯誤,
如:
明明有該筆資料,select結果卻是空的,這種神奇的事情發生,
原因是select到一半就被踢掉,所以結果當然是空的。
所以當我執行緒過多=>連線過多=>怪問題一堆。
推 Peruheru: 這樣阿,好吧XD 12/25 15:31
推 GoalBased: 連線當然不能過多啊 不然跟被攻擊有甚麼差別 12/25 15:31
→ Peruheru: 那不然這樣,就是獨立sql查詢的部分為一個執行緒 12/25 15:32
→ Peruheru: 所有人的查詢動作都丟到一個池內,然後sql執行緒去執行 12/25 15:33
→ Peruheru: 這樣永遠都是同一個執行緒在使用同一條連線,沒有衝突 12/25 15:33
→ Peruheru: 只是變成原本sql查詢的部分變成要等待執行緒執行到他們 12/25 15:34
→ Peruheru: 的查詢結果才行,每個人就領個號碼牌等叫號 12/25 15:34
→ Peruheru: 就是把SQL查詢的部分獨立為一個代理的意思 12/25 15:35
→ Peruheru: 可能長時間未偵測到查詢,就關閉連線,要用再開 12/25 15:36
推 Peruheru: 甚至可以做出優先權高的查詢優先執行這種事 12/25 15:44
→ Peruheru: 不知道這樣行不行? 12/25 15:45
基本上,作法2.(3)就已經是沒問題了,不會有「神奇的事情發生」,
但2.(3)的缺點就是要讓執行緒等…,
當開一兩條執行緒的時候還可以接受,
當開100條執行緒,一個執行緒有20個指令,大家都共用同一個連線,大家互相等,
我覺得這樣的時間耗費有點誇張。
有點左右為難
推 Peruheru: 不然就像窗口一樣多開幾個窗口嘛 12/25 16:11
→ Peruheru: 一個服務員處理不來,就多兩個服務員,時間就剩三分之一 12/25 16:11
感謝你的意見,
但有些想法難以在現在的程式底下進行修改,
又或者修改的幅度太大,上頭不肯接受這時間的耗費。
如果是新的程式會使用你的想法看看,謝。
推 Litfal: 這得看你的多執行續是做啥、怎樣設計的。 12/25 18:07
→ Litfal: 一般來說我會用(1)+Connection Pool 12/25 18:08
Thx,我會去了解 Connection Pool,
順便請問你是否可以提供一些參考方向或參考書籍?
※ 編輯: StupidGaGa (60.249.117.38), 12/26/2014 10:18:25
→ Litfal: 你應該考慮控制執行續的數量,因為不是多一點執行續就會 12/26 16:59
→ Litfal: 比較快,I/O bound還是在那邊,甚至還會導致塞車... 12/26 17:00