我有一個Win-CGI應用程序,我正在轉換爲ISAPI。安全地在主線程中使用TAdsSettings對象,並在其他線程中使用AdsQuery對象?
應用程序使用TDataset後代用於擴展系統優勢數據庫服務器。
由於TAdsSettings對象只能有一個實例,所以在主線程中必須爲 。
請求線程需要TAdsQuery對象。
將這項工作 - 也就是說,將在請求的線程 拿起從AdsSettings全局設置的AdsQueries主 線程對象,並將這是線程安全的嗎?
我有一個Win-CGI應用程序,我正在轉換爲ISAPI。安全地在主線程中使用TAdsSettings對象,並在其他線程中使用AdsQuery對象?
應用程序使用TDataset後代用於擴展系統優勢數據庫服務器。
由於TAdsSettings對象只能有一個實例,所以在主線程中必須爲 。
請求線程需要TAdsQuery對象。
將這項工作 - 也就是說,將在請求的線程 拿起從AdsSettings全局設置的AdsQueries主 線程對象,並將這是線程安全的嗎?
是的,它會工作。 TAdsSettings組件修改Advantage Client Engine(ACE)中的設置,使用ISAPI將會加載一個所有線程都使用的ACE實例。
但我不會推薦它。根據您正在更改的設置,直接調用ACE API會更有意義。例如,如果您只設置日期格式,那麼消除TAdsSettings組件並僅調用需要連接句柄的AdsSetDateFormat60會更有意義。擺脫TAdsSettings組件消除了大量調用來設置ACE全局設置。這些調用中的很多都必須有一個同步對象,以在全局改變時保持所有連接關閉。這會對性能產生負面影響,特別是在像web應用程序這樣的多線程應用程序中。而是調用在指定的連接句柄上進行操作。
您可以通過引用TAdsConnection.Handle屬性或調用TAdsQuery.GetAceConnectionHandle方法來獲取連接句柄。
確保AdsQueries使用同步訪問直接TAdsSettings(或使用通訊系統工作者線程和主線程,而不是直接訪問之間comunicate),如果他們不是在主線程(即System.MainThreadID <> Windows.GetCurrentThreadID
)
我也問過這個問題在新聞組:devzone.advantagedatabase.com,Advantage.Delphi
爲了完整起見,我會從該線程的其餘部分添加進一步的問題/回答:
問題(我):
許多線程查詢目前未連接到 TAdsConnection對象。我打算爲每個 線程創建一個用於這些「孤立」查詢的連接,但它是一個大型應用程序 ,這需要時間。我也很確定TAdsSettings對象中唯一的非默認 屬性是服務器類型集,它也可以在連接組件中設置 ,因此一旦所有查詢連接到連接, 設置組件將不會被需要。我會看 直接調用設置API作爲替代。
與此同時,我確實有一個關於線程的問題和查詢 沒有分配連接組件。我從幫助文件中注意到 如果多個線程中的查詢共享單個連接對象,則將以串行方式運行查詢,而不是同時運行查詢。在每個線程中有一個連接對象 ,這不應該是一個問題,但我想知道不是有連接對象 分配的查詢的 。他們會被認爲是從多線程併發的角度來看 的獨立連接,或者他們會被認爲是在同一個連接上,因此不得不屈服於其他每個 ?
答案(傑里米):
您將需要解決這個問題。他們將只搜索連接 的全局列表以找到具有相同路徑的連接,並且它們將使用該連接。在多線程應用程序中不好 。
因此,從Jeremy的回答來看,最好爲每個線程創建至少一個TAdsConnection對象,並確保所有查詢都連接到它,否則可能會發生序列化。
我一般同意,同步是從子線程使用主線程最安全(同步)的方式。 (消息最好的異步方式) 但是,我特別要求關於ADS comps,而不是通用線程。傑里米擁有更多關於ADS細節及其內部運作的相關信息 – Graza 2008-09-22 10:08:32