可以安全地在主线程中使用TAdsSettings对象,在其他线程中使用AdsQuery对象吗?

时间:2008-09-18 14:08:16

标签: multithreading delphi advantage-database-server

我有一个Win-CGI应用程序,我目前正在转换为ISAPI。

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

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

请求线程中需要TAdsQuery对象。

这是否有效 - 也就是请求线程中的AdsQueries 从主广告中的AdsSettings对象中获取全局设置 线程,这将是线程安全的吗?

3 个答案:

答案 0 :(得分:1)

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

但是,我不推荐它。根据您正在更改的设置,直接调用ACE API会更有意义。例如,如果您只设置日期格式,则删除TAdsSettings组件更有意义,只需调用AdsSetDateFormat60即可获取连接句柄。摆脱TAdsSettings组件消除了许多设置ACE全局设置的调用。其中许多调用必须有一个同步对象,以便在全局更改时关闭所有连接。这将对性能产生负面影响,尤其是在像Web应用程序这样的多线程应用程序中。而是进行在指定连接句柄上操作的调用。

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

答案 1 :(得分:0)

确保AdsQueries使用Synchronize直接访问TAdsSettings(或使用消息传递系统在工作线程和主线程之间进行通信而不是直接访问),如果它们不在主线程中(即System.MainThreadID <> Windows.GetCurrentThreadID)< / p>

答案 2 :(得分:0)

我也在新闻组中提出了这个问题:devzone.advantagedatabase.com,Advantage.Delphi

为了完整起见,我将从该主题的其余部分添加更多问题/答案:

  

问题(我):

     

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

     

与此同时,我确实对线程和查询有疑问   没有分配连接组件。我从帮助文件中注意到了   如果多个线程中的查询共享一个连接对象,则   查询将以串行方式运行,而不是同时运行。有了   每个线程中的连接对象,这应该不是问题,但我是   想知道的查询是否有连接对象   分配。他们是否会被认为是独立的联系人   多线程并发的观点,或者它们会是什么   被认为是在同一个连接上,因此必须屈服于每个   其他

     

答案(杰里米):

     

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

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