全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2587
推到 Plurk!
推到 Facebook!

請問有關3-tier架構上使用adoconnect的問題?

答題得分者是:ko
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-13 09:48:34 IP:219.87.xxx.xxx 訂閱
各位大大可否請教一下,我如果有多個client要同時執行,例如八個client同時使用,分別裝在不同的電腦上,並且採用3-tier的架構,目前的做法是每一台主機上自行安裝mts,但好像在多台client同時啟用時會造成db產生lock的問題,所以我的問題如下,請各位知道的幫忙解釋一下,謝謝。

Q:請問如果我只用一台client當mts,將其它台都連結到這台pc上,請問adoconnect會做控管一次只讓一個連線使用嗎?還是adoconnect會有做pool的功能?

因為同時使用多台PC各別使用自已PC上的MTS連到DB上會有LOCK的情況發生,目前在DB中也在找尋解決的方法,所以在CLIENT端也想請教一下這個關念,如果不行的可能要改採用一台PC當MTS的做法再試試,麻煩各位了,謝謝。

D7 mssql adoconnection
------
DELPHI初學者
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-13 19:10:25 IP:61.66.xxx.xxx 訂閱
3-tier的架構應該不會有LOCK的情況!!
是否再注意一下AP SERVER的動作是否會造成多CONNECTION的狀況

===================引 用 macchen 文 章===================
各位大大可否請教一下,我如果有多個client要同時執行,例如八個client同時使用,分別裝在不同的電腦上,並且採用3-tier的架構,目前的做法是每一台主機上自行安裝mts,但好像在多台client同時啟用時會造成db產生lock的問題,所以我的問題如下,請各位知道的幫忙解釋一下,謝謝。

Q:請問如果我只用一台client當mts,將其它台都連結到這台pc上,請問adoconnect會做控管一次只讓一個連線使用嗎?還是adoconnect會有做pool的功能?

因為同時使用多台PC各別使用自已PC上的MTS連到DB上會有LOCK的情況發生,目前在DB中也在找尋解決的方法,所以在CLIENT端也想請教一下這個關念,如果不行的可能要改採用一台PC當MTS的做法再試試,麻煩各位了,謝謝。

D7 mssql adoconnection
------
======================
昏睡~
不昏睡~
不由昏睡~
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-14 09:18:00 IP:219.87.xxx.xxx 訂閱
非常感謝你的回覆,請問一下,因為我是有八個clinet,都安裝在個別的pc上,而我mts也是分別裝在這八台pc上,就是一個clinet使用自已的mts,請問這樣也不會有影響嗎?另外問一下,你所謂的「AP SERVER的動作是否會造成多CONNECTION的狀況」,我在測試時,因為有發生lock的問題,所以我有在mssql的管理工具下查看,8個client連線上去就只會有八個sid顯示在上面,加上mssql基本的二個sid,我比較有問題的是,這八個mts同時連到一個sp(預儲程序)會造成lock的問題嗎?還是我是sp內的寫法會造成lock,麻煩再指導我一下,這個問題已經發生很久了,一直找不到相關的資訊可以解決,謝謝你,而且常常會報「Lock request time out period exceeded」這個訊息,我查證後發現這個應該是我有在sp中設定time_out的變數,但等不到回應sql回傳的error吧,謝謝,sp內容如下。
[code sql]
CREATE procedure dbo.execBulkInsert
( @path varchar(30),@KIND VARCHAR(10),@PARAM1 VARCHAR(128), @BoardSN varchar(30),@fdate varchar(20), @up varchar(2),
@VINT INT OUTPUT)
AS
BEGIN
DECLARE @vTestCount int,
@Var1 VARCHAR(30)
SET LOCK_TIMEOUT 30000
SET XACT_ABORT ON

IF @KIND='Insert'
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
exec ('bulk insert board' @path ' from ''' @PARAM1 @path 'board.txt'' WITH (FIELDTERMINATOR = '','', TABLOCK , MAXERRORS=0 )')
exec ('bulk insert component' @path ' from ''' @PARAM1 @path 'component.txt'' WITH (BATCHSIZE = 1000, FIELDTERMINATOR = '','', TABLOCK , MAXERRORS=0 )')
exec ('bulk insert boardSFC from ''' @PARAM1 @path 'boardSFC.txt'' WITH (FIELDTERMINATOR = '','', TABLOCK , MAXERRORS=0 )')
exec ('bulk insert componentSFC from ''' @PARAM1 @path 'componentSFC.txt'' WITH (BATCHSIZE = 1000, FIELDTERMINATOR = '','', TABLOCK , MAXERRORS=0 )')
exec ('bulk insert OpenShort from ''' @PARAM1 @path 'Pin.txt'' WITH (BATCHSIZE = 1000, FIELDTERMINATOR = '','', TABLOCK , MAXERRORS=0 )')
COMMIT TRAN
RETURN
END
END
GO

[/code]
===================引 用 ko 文 章===================
3-tier的架構應該不會有LOCK的情況!!
是否再注意一下AP SERVER的動作是否會造成多CONNECTION的狀況
------
DELPHI初學者
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-14 10:24:18 IP:61.66.xxx.xxx 訂閱
按照您的做法似乎沒有[中繼]的程式,而是CLIENT自己跑
那您是否先對INSERT的時間做測試,再來看MSSQL的執行緒優先次序
我覺得是因為相同MTS所以才會有LOCK的狀況
建議procedure 加上TRY來中斷解除LOCK的狀況並回傳錯誤
------
======================
昏睡~
不昏睡~
不由昏睡~
編輯記錄
ko 重新編輯於 2009-08-14 10:29:45, 註解 無‧
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-14 10:56:32 IP:219.87.xxx.xxx 訂閱
你好,謝謝你的回覆,請問一下,你所謂沒有[中繼]的程式是指什麼?我不太了解這個意思。

請問一下什麼是「對INSERT的時間做測試,再來看MSSQL的執行緒優先次序」,你是指bulkinser的動作嗎?因為這個部份我有做log,而且在程式執行時,是會一直run這個,因為有很大量的資料要做insert的動作,所以才會使用bulkinsert來處理,不然會來不及,後面那句mssql的次序要怎麼看?小弟真的不是很懂你的意思,麻煩可以解釋一下嗎?

「我覺得是因為相同MTS所以才會有LOCK的狀況」,這個是指八台pc使用同一個mts才有可能會造成lock嗎?可是adoconnection不是會做控管嗎(這個我不清楚呢,所以才會問,如果關念有錯請指導一下,謝謝。)

「建議procedure 加上TRY來中斷解除LOCK的狀況並回傳錯誤」,這是指在clinet端用try嗎?還是mts中用try,這二個我都有加了,而回傳的碼就是「Lock request time out period exceeded」,我在mts跟sp中都是設定30秒,因為之前有dead lock的情況發生,所以才設定30秒解除,謝謝。

不好意思,可能是我理解能力不好,所以再麻煩大大幫忙一下,謝謝您。
===================引 用 ko 文 章===================
按照您的做法似乎沒有[中繼]的程式,而是CLIENT自己跑
那您是否先對INSERT的時間做測試,再來看MSSQL的執行緒優先次序
我覺得是因為相同MTS所以才會有LOCK的狀況
建議procedure 加上TRY來中斷解除LOCK的狀況並回傳錯誤
------
DELPHI初學者
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-15 08:01:39 IP:118.168.xxx.xxx 訂閱
一般我們寫三層式是

[SERVER]-----[AP]====[CLIENT]
|_____[CLIENT]
|_____[CLIENT]
|_____[CLIENT]
AP就是中繼的程式,就是提供多人操作時的資源分配角色
對於MSSQL的資源分配,單單靠MSSQL本身的engine
會有因連線本身的權限導致執行程序上的先後次序,這個資源獲得的先後
跟[語法][連線登入帳號][儲存程序]有相當的影響,
簡單的說我認為mts本身條件是管理連線至於資源分配要靠您來處理,
所以我「建議procedure 加上TRY來中斷解除LOCK的狀況並回傳錯誤」
是要中斷procedure 的INSERT被LOCK時可以立刻回傳錯誤,再用程式控制再送一次INSERT
而非在procedure 裡面設定TIMEOUT,因為procedure 失敗後並不會自行在RECALL FUNCTION自己
and MTS也不會~



===================引 用 macchen 文 章===================
你好,謝謝你的回覆,請問一下,你所謂沒有[中繼]的程式是指什麼?我不太了解這個意思。

請問一下什麼是「對INSERT的時間做測試,再來看MSSQL的執行緒優先次序」,你是指bulkinser的動作嗎?因為這個部份我有做log,而且在程式執行時,是會一直run這個,因為有很大量的資料要做insert的動作,所以才會使用bulkinsert來處理,不然會來不及,後面那句mssql的次序要怎麼看?小弟真的不是很懂你的意思,麻煩可以解釋一下嗎?

「我覺得是因為相同MTS所以才會有LOCK的狀況」,這個是指八台pc使用同一個mts才有可能會造成lock嗎?可是adoconnection不是會做控管嗎(這個我不清楚呢,所以才會問,如果關念有錯請指導一下,謝謝。)

「建議procedure 加上TRY來中斷解除LOCK的狀況並回傳錯誤」,這是指在clinet端用try嗎?還是mts中用try,這二個我都有加了,而回傳的碼就是「Lock request time out period exceeded」,我在mts跟sp中都是設定30秒,因為之前有dead lock的情況發生,所以才設定30秒解除,謝謝。

不好意思,可能是我理解能力不好,所以再麻煩大大幫忙一下,謝謝您。
===================引 用 ko 文 章===================
按照您的做法似乎沒有[中繼]的程式,而是CLIENT自己跑
那您是否先對INSERT的時間做測試,再來看MSSQL的執行緒優先次序
我覺得是因為相同MTS所以才會有LOCK的狀況
建議procedure 加上TRY來中斷解除LOCK的狀況並回傳錯誤
------
======================
昏睡~
不昏睡~
不由昏睡~
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-17 13:14:55 IP:219.87.xxx.xxx 訂閱
先謝謝你的回覆,我可以先請問一下,你說的procedure是delphi的procedure還是stored procedure的這個,db內的我倒是不知有try這個東西(拍謝,沒學好),所以你的意思是說,如果現階段發生了lock,用excpetion的方式,然後讓client再重call一次mts嗎?這樣子mts只是一個中繼的功能,並無做任何與mssql連線方面的處理,所以mts是每一個client連一個與多個client連一個mts的意思是相同了,如有誤解請再指導一下,謝謝。
因為我的問題是比較想了解mts的功能與mssql內為何會lock,而我不知如何找這方面的相關的資訊,因為我在寫別的與db連線的程式並無此問題發生,而是因為這個client需要大量且即時的插入資料,而且又是對同一個table去做處理才會造成這個問題,請再幫忙,謝謝。
===================引 用 ko 文 章===================
一般我們寫三層式是

[SERVER]-----[AP]====[CLIENT]
|_____[CLIENT]
|_____[CLIENT]
|_____[CLIENT]
AP就是中繼的程式,就是提供多人操作時的資源分配角色
對於MSSQL的資源分配,單單靠MSSQL本身的engine
會有因連線本身的權限導致執行程序上的先後次序,這個資源獲得的先後
跟[語法][連線登入帳號][儲存程序]有相當的影響,
簡單的說我認為mts本身條件是管理連線至於資源分配要靠您來處理,
所以我「建議procedure 加上TRY來中斷解除LOCK的狀況並回傳錯誤」
是要中斷procedure 的INSERT被LOCK時可以立刻回傳錯誤,再用程式控制再送一次INSERT
而非在procedure 裡面設定TIMEOUT,因為procedure 失敗後並不會自行在RECALL FUNCTION自己
and MTS也不會~
------
DELPHI初學者
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-17 13:57:10 IP:61.66.xxx.xxx 訂閱
是低!!
delphi的procedure要加TRY
stored procedure是用excpetion的方式 (@@error=0)
我假設有三個連線同時間新增~
MTS處理了A(處理中一定是資料表LOCK)
BC在等待,等到A的程序INSERT完成,請問MTS會先處理B還是C~
我認為都不會處理~因為stored procedure跑完了!! 而且回傳LOCK的錯誤
所以程序處在LISTEN的狀態
------
======================
昏睡~
不昏睡~
不由昏睡~
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-08-17 16:49:36 IP:219.87.xxx.xxx 訂閱
你好,謝謝你的回覆,那按照你的說法,所以應該是只能用一個mts了,因為abc在連線後,a先處理,bc會等待,如果我三個clinet同時使用三個mts,那a在連線,那b/c應該也都會同時連線,這樣不就都沒在等待了,那sp內不是應該會等待嗎?直到該table被解鎖才會有另一個來處理這個table,這樣的話,那不是會常常lock嗎?因為我在執行時,並不是時常發生,雖然機率也不低啦,我統整一下你說的結論,有錯請更正:
1 只用一個mts讓所有的client同時連線,mts會有pool的功能
2 同一時間在sp內應該只有一個連線在執行,有錯誤用判斷@@error的方式立即返回mts,由mts再指定下一個連線(還是不動了???指沒有client在這mts上了)

以上,再麻煩指正一下,謝謝。
===================引 用 ko 文 章===================
是低!!
delphi的procedure要加TRY
stored procedure是用excpetion的方式 (@@error=0)
我假設有三個連線同時間新增~
MTS處理了A(處理中一定是資料表LOCK)
BC在等待,等到A的程序INSERT完成,請問MTS會先處理B還是C~
我認為都不會處理~因為stored procedure跑完了!! 而且回傳LOCK的錯誤
所以程序處在LISTEN的狀態
------
DELPHI初學者
andyfurong
一般會員


發表:2
回覆:3
積分:1
註冊:2006-11-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-09-30 12:25:46 IP:119.144.xxx.xxx 未訂閱
 無需擔心這個問題。。。。
遠程數據模塊是線程模塊的, 如果Connection是放在遠程數據模塊上的話,每一個CLIENT連到服務器,都會在各自的線程中處理。連接也是在各自的線程中的。。。。。
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-11-18 10:35:56 IP:123.240.xxx.xxx 訂閱
這個討論串對於錯誤訊息似乎有些誤解
"Lock request time out period exceeded"
是指lock的時間超過你指定的時間(30s)而不是發生Lock本身
這應該是由delphi(的ADO元件)所發出的錯誤,
他應該只是一個保護機制,
解決辦法為提高ADO元件的Timeout使有足夠時間執行StoredProc


系統時間:2017-12-13 5:38:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!