2008-09-18 111 views
1

我有一个Win-CGI应用程序,我正在转换为ISAPI。安全地在主线程中使用TAdsSettings对象,并在其他线程中使用AdsQuery对象?

应用程序使用TDataset后代用于扩展系统优势数据库服务器。

由于TAdsSettings对象只能有一个实例,所以在主线程中必须为 。

请求线程需要TAdsQuery对象。

将这项工作 - 也就是说,将在请求的线程 拿起从AdsSettings全局设置的AdsQueries主 线程对象,并将这是线程安全的吗?

回答

1

是的,它会工作。 TAdsSettings组件修改Advantage Client Engine(ACE)中的设置,使用ISAPI将会加载一个所有线程都使用的ACE实例。

但我不会推荐它。根据您正在更改的设置,直接调用ACE API会更有意义。例如,如果您只设置日期格式,那么消除TAdsSettings组件并仅调用需要连接句柄的AdsSetDateFormat60会更有意义。摆脱TAdsSettings组件消除了大量调用来设置ACE全局设置。这些调用中的很多都必须有一个同步对象,以在全局改变时保持所有连接关闭。这会对性能产生负面影响,特别是在像web应用程序这样的多线程应用程序中。而是调用在指定的连接句柄上进行操作。

您可以通过引用TAdsConnection.Handle属性或调用TAdsQuery.GetAceConnectionHandle方法来获取连接句柄。

0

确保AdsQueries使用同步访问直接TAdsSettings(或使用通讯系统工作者线程和主线程,而不是直接访问之间comunicate),如果他们不是在主线程(即System.MainThreadID <> Windows.GetCurrentThreadID

+0

我一般同意,同步是从子线程使用主线程最安全(同步)的方式。 (消息最好的异步方式) 但是,我特别要求关于ADS comps,而不是通用线程。杰里米拥有更多关于ADS细节及其内部运作的相关信息 – Graza 2008-09-22 10:08:32

0

我也问过这个问题在新闻组:devzone.advantagedatabase.com,Advantage.Delphi

为了完整起见,我会从该线程的其余部分添加进一步的问题/回答:

问题(我):

许多线程查询目前未连接到 TAdsConnection对象。我打算为每个 线程创建一个用于这些“孤立”查询的连接,但它是一个大型应用程序 ,这需要时间。我也很确定TAdsSettings对象中唯一的非默认 属性是服务器类型集,它也可以在连接组件中设置 ,因此一旦所有查询连接到连接, 设置组件将不会被需要。我会看 直接调用设置API作为替代。

与此同时,我确实有一个关于线程的问题和查询 没有分配连接组件。我从帮助文件中注意到 如果多个线程中的查询共享单个连接对象,则将以串行方式运行查询,而不是同时运行查询。在每个线程中有一个连接对象 ,这不应该是一个问题,但我想知道不是有连接对象 分配的查询的 。他们会被认为是从多线程并发的角度来看 的独立连接,或者他们会被认为是在同一个连接上,因此不得不屈服于其他每个 ?

答案(杰里米):

您将需要解决这个问题。他们将只搜索连接 的全局列表以找到具有相同路径的连接,并且它们将使用该连接。在多线程应用程序中不好 。

因此,从Jeremy的回答来看,最好为每个线程创建至少一个TAdsConnection对象,并确保所有查询都连接到它,否则可能会发生序列化。

相关问题