代码之家  ›  专栏  ›  技术社区  ›  Graza

在主线程中安全地使用tadssettings对象,在其他线程中安全地使用adsquery对象?

  •  1
  • Graza  · 技术社区  · 16 年前

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

    应用程序将TDataset后代用于扩展的Systems Advantage数据库服务器。

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

    请求线程中需要tadsquery对象。

    这是否有效——也就是说,请求线程中的ADSQueries是否有效 从主目录中的adssettings对象获取全局设置 线程,这是线程安全吗?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Jeremy Mullin    16 年前

    是的,它会起作用的。tadssettings组件修改Advantage客户机引擎(ace)中的设置,使用isapi,将有一个所有线程都使用的ace加载实例。

    不过,我不推荐它。根据您正在更改的设置,直接调用ACE API会更有意义。例如,如果您只设置日期格式,那么消除tadsettings组件并只调用adssetdateformat60(它接受一个连接句柄)就更有意义了。去掉tadssettings组件可以消除设置ace全局设置的大量调用。其中许多调用都必须有一个同步对象,以便在全局更改时关闭所有连接。这将对性能产生负面影响,尤其是在像Web应用程序这样的多线程应用程序中。而是对指定的连接句柄进行操作。

    您可以通过引用tadsconnection.handle属性或调用tadsquery.getaceConnectionHandle方法来获取连接句柄。

        2
  •  0
  •   Francesca    16 年前

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

        3
  •  0
  •   Graza    16 年前

    我也在新闻组问过这个问题:devzone.advantagedabase.com,advantage.delphi

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

    问题(ME):

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

    同时,我还有一个关于线程和查询的问题 未分配连接组件。我从帮助文件中注意到 如果多个线程中的查询共享一个连接对象,则 查询将连续运行,而不是同时运行。用一个 每个线程中的连接对象,这不应该是一个问题,但我是 想知道哪些查询可以 具有连接对象 分配。是否将其视为独立连接 多线程并发的观点,或者他们是 被认为是在同一连接上,因此必须屈服于每一个 其他?

    回答(杰里米):

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

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