Multithreading 在主线程中使用TAdsSettings对象,在其他线程中使用AdsQuery对象是否安全?
我有一个Win CGI应用程序,目前正在转换为ISAPI 该应用程序将TDataset子体用于扩展系统Advantage数据库服务器 由于TAdsSettings对象只能有一个实例,因此必须 在主线程中 请求线程中需要TAdsQuery对象 这会起作用吗?也就是说,请求线程中的AdsQueries会起作用吗 从主菜单中的AdsSettings对象中选择全局设置Multithreading 在主线程中使用TAdsSettings对象,在其他线程中使用AdsQuery对象是否安全?,multithreading,delphi,advantage-database-server,Multithreading,Delphi,Advantage Database Server,我有一个Win CGI应用程序,目前正在转换为ISAPI 该应用程序将TDataset子体用于扩展系统Advantage数据库服务器 由于TAdsSettings对象只能有一个实例,因此必须 在主线程中 请求线程中需要TAdsQuery对象 这会起作用吗?也就是说,请求线程中的AdsQueries会起作用吗 从主菜单中的AdsSettings对象中选择全局设置 线程,这是线程安全的吗?如果工作线程和主线程不在主线程中,请确保AdsQueries使用Synchronize直接访问TADSSetti
线程,这是线程安全的吗?如果工作线程和主线程不在主线程中,请确保AdsQueries使用Synchronize直接访问TADSSetting(或使用消息传递系统在工作线程和主线程之间进行通信,而不是直接访问)(即
system.MainThreadID Windows.GetCurrentThreadID
)确保AdsQueries使用Synchronize直接访问TAdsSettings(或使用消息传递系统在工作线程和主线程之间通信,而不是直接访问),如果它们不在主线程中(即system.MainThreadID Windows.GetCurrentThreadID
)是的,它可以工作。TAdsSettings组件修改Advantage Client Engine(ACE)中的设置,使用ISAPI将加载一个ACE实例,供所有线程使用
然而,我不推荐它。根据您正在更改的设置,直接调用ACE API更有意义。例如,如果您只设置日期格式,那么消除TAdsSettings组件并调用AdsSetDateFormat60就更有意义了,因为AdsSetDateFormat60接受一个连接句柄。摆脱TAdsSettings组件可以消除大量设置ACE全局设置的调用。这些调用中的许多都必须有一个sync对象,以便在更改全局时关闭所有连接。这将对性能产生负面影响,特别是在多线程应用程序(如web应用程序)中。而是在指定的连接句柄上进行操作的调用
您可以通过引用TAdsConnection.handle属性或调用TAdsQuery.GetAceConnectionHandle方法来获取连接句柄。是的,它可以工作。TAdsSettings组件修改Advantage Client Engine(ACE)中的设置,使用ISAPI将加载一个ACE实例,供所有线程使用 然而,我不推荐它。根据您正在更改的设置,直接调用ACE API更有意义。例如,如果您只设置日期格式,那么消除TAdsSettings组件并调用AdsSetDateFormat60就更有意义了,因为AdsSetDateFormat60接受一个连接句柄。摆脱TAdsSettings组件可以消除大量设置ACE全局设置的调用。这些调用中的许多都必须有一个sync对象,以便在更改全局时关闭所有连接。这将对性能产生负面影响,特别是在多线程应用程序(如web应用程序)中。而是在指定的连接句柄上进行操作的调用
您可以通过引用TAdsConnection.handle属性或调用TAdsQuery.GetAceConnectionHandle方法来获取连接句柄。我也在新闻组中问过这个问题:devzone.advantagedatabase.com,Advantage.Delphi 为了完整起见,我将添加该线程其余部分的进一步问题/答案: 问题(我): 线程中的许多查询当前未附加到 TAdsConnection对象。我正计划为每个人创建一个连接 线程用于这些“孤立”查询,但它是一个大型应用程序 这需要时间。我也很确定,唯一的非默认 TAdsSettings对象中的属性是服务器类型集,它可以 也可以在连接组件中设置,因此一旦完成所有查询 链接到连接时,不需要设置组件。我去看看 直接调用设置API作为替代方法 同时,我确实有一个关于线程和查询的问题 没有指定连接组件。我从帮助文件中注意到 如果多个线程中的查询共享一个连接对象,则 查询将以串行方式运行,而不是同时运行。用一个 每个线程中的连接对象,这不应该是问题,但我是 想知道没有连接对象的查询吗 分配。它们是否会被视为独立于 从多线程并发性的角度来看,它们是什么 被认为是在同一个连接上,因此必须屈服于每个连接 其他的 回答(杰里米): 你需要解决这个问题。他们将只搜索一个全局连接列表 找到一个具有相同路径的,他们将使用该连接。不好的 在多线程应用程序中
因此,根据Jeremy的回答,最好为每个线程创建至少一个TAdsConnection对象,并确保所有查询都附加到该对象,否则可能会发生序列化。我在新闻组中也提出了这个问题:devzone.advantagedatabase.com,Advantage.Delphi 为了完整起见,我将添加该线程其余部分的进一步问题/答案: 问题(我): 线程中的许多查询当前未附加到 TAdsConnection对象。我正计划为每个人创建一个连接 线程用于这些“孤立”查询,但它是一个大型应用程序 这需要时间。我也很确定,唯一的非默认 TAdsSettings对象中的属性是服务器类型集,它可以 也可以在连接组件中设置,因此一旦完成所有查询 链接到连接时,不需要设置组件。我去看看 调用设置