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

该应用程序使用 Extended Systems Advantage 数据库服务器的 TDataset 后代。

由于只能有一个TADSSETTINGS对象的实例,因此必须在主线程中。

请求线程中需要 TAdsQuery 对象。

这项工作是否会 - 也就是说,请求线程中的adsqueries是否会从主线程中的adsSettings对象中拾取全局设置,这是否安全?

有帮助吗?

解决方案

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

不过,我不会推荐它。根据您要更改的设置,直接调用 ACE API 会更有意义。例如,如果您仅设置日期格式,则消除 TAdsSettings 组件并仅调用采用连接句柄的 AdsSetDateFormat60 更有意义。摆脱 TAdsSettings 组件可以消除设置 ACE 全局设置的大量调用。其中许多调用必须有一个同步对象,以在全局更改时保持所有连接关闭。这会对性能产生负面影响,尤其是在 Web 应用程序等多线程应用程序中。而是进行对指定连接句柄进行操作的调用。

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

其他提示

如果 AdsQueries 不在主线程(即, System.MainThreadID <> Windows.GetCurrentThreadID)

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

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

问我):

当前,线程中的许多查询目前未连接到TadSconnection对象。我计划为这些“孤儿”查询创建一个连接,但这是一个很大的应用程序,这将需要时间。我也很确定,TADSSETTINGS对象中唯一的非默认属性是服务器类型集,也可以在连接组件中设置,因此一旦所有查询都链接到连接,则不需要设置组件。我将考虑直接调用设置API作为替代方案。

同时,我确实有一个有关线程和未分配连接组件的查询的问题。我从帮助文件中指出,如果多个线程中的查询共享一个连接对象,则查询将以串联而不是同时运行。在每个线程中有一个连接对象,这不是一个问题,但是我想知道的查询 不是 分配了连接对象。从多线程并发的角度来看,是否会认为它们是独立的联系,还是将它们视为相同的连接,因此必须彼此屈服?

回答(杰里米):

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top