2011-04-08 53 views

回答

10

我發現,大多數數據庫API的只在螺紋連接級別的安全。火鳥可能會有所不同,但使用InterBase幾年(8+)以前,它不是線程安全的。更新:I have verified Firebird is only thread safe at the connection level.

這意味着您通常需要避免同時使用來自多個線程的單個連接。針對給定連接執行查詢。 避免在針對相同連接運行的不同線程中有兩個查詢。

但是,如果你有兩個連接,你可以同時運行兩個查詢。

您的問題的本質似乎是如何以安全的方式將數據傳遞給線程,儘管您的具體需求是數據庫,但無論線程中包含的內容如何,​​這都適用於通用方式。

傳遞數據的最簡單方法是在創建時,您可以創建掛起的線程,在TThread後代中設置各種屬性。然後恢復線程的執行。 您需要從Execute()方法調用執行線程中工作的實際代碼。

如果您需要在線程之間共享數據,則必須將其包含在允許同步的各種結構之一中,例如Critical Section,Mutex或Semaphore。

Delphi在SyncObjs.pas單元中爲它們中的每一個都有庫包裝器。

+0

+1對於我的其中一個項目,我廣泛使用它(後臺線程中的查詢)。但是我不需要將實際的查詢對象從一個線程傳遞到下一個線程,而我正在爲每個線程使用一對DbConnection +事務。 – 2011-04-08 11:51:09