請問有關3-tier架構上使用adoconnect的問題? |
答題得分者是:ko
|
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
各位大大可否請教一下,我如果有多個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 發送簡訊給我 |
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 發送簡訊給我 |
非常感謝你的回覆,請問一下,因為我是有八個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 發送簡訊給我 |
|
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
你好,謝謝你的回覆,請問一下,你所謂沒有[中繼]的程式是指什麼?我不太了解這個意思。
請問一下什麼是「對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 發送簡訊給我 |
一般我們寫三層式是
[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 發送簡訊給我 |
先謝謝你的回覆,我可以先請問一下,你說的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 發送簡訊給我 |
|
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
你好,謝謝你的回覆,那按照你的說法,所以應該是只能用一個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 發送簡訊給我 |
|
wuabc
初階會員 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |