【问题标题】:How should I implement an ADO connection in an HTTP TIdServerContext thread?我应该如何在 HTTP TIdServerContext 线程中实现 ADO 连接?
【发布时间】:2014-08-07 02:24:08
【问题描述】:

我一直在使用 HTTP 服务器 (TIdHTTPServer) 处理 OnCommandGet 事件。我刚刚创建了TIdServerContext 的继承对象并覆盖了它的构造函数和析构函数。现在,我想将我的数据库连接从之前的自定义会话对象移动到这个上下文线程中。服务器的KeepAlive 属性已启用。

目标是回收每个会话中实现的数据库连接。目前每个请求都会产生一个新的 ADO 连接,我想避免这种情况。我理解KeepAlive 并不一定意味着整个登录/注销会话,而只是保持持续连接以节省资源。

我的问题是,我应该如何利用我继承的TIdServerContext 对象来维护它自己的一致数据库连接 (TADOConnection) - 每个请求都可以使用它(在 COM 规则中 (CoInitialize))?

我假设我在OnCommandGet 事件处理程序中放置的任何代码都在与继承的TIdServerContext 相同的线程上下文中运行 - 这是正确的吗?本质上是……在同一个线程和COM中同时使用TIdServerContext.OnRunTIdHTTPServer.OnCommandGet安全吗?

【问题讨论】:

    标签: multithreading delphi ado indy10 httpserver


    【解决方案1】:

    OnCommandGet 确实在 TIdServerContext 所在的同一线程中运行。

    您不能分配自己的OnRun 处理程序,因为TIdCustomTCPServer 已经使用该事件来触发其DoExecute() 方法,而TIdHTTPServer 将覆盖该方法以触发其OnCommamd... 事件。

    如果您想在来自同一个客户端的多个请求中重复使用 DB 对象,您可以初始化 COM 并在 OnConnect 事件中创建 DB 对象,然后释放 DB 对象并释放OnDisconnect 事件中的 COM。但是,仅当客户端在每个请求上请求保持活动时,使用这些事件才有帮助,这不是保证。 TIdHTTPServer.KeepAlive 属性仅允许服务器在请求时遵守 keepalive,它不会强制客户端请求它们。如果没有请求,每个请求都会触发自己的一对OnConnect/OnDisconnect 事件。

    ADO 是基于 COM 的,因此它具有线程关联性。此外,COM 应该每个线程只初始化一次。因此,最好在线程启动时初始化 COM 并创建 DB 对象,并在线程结束时释放 DB 对象并释放 COM。默认情况下,Indy 服务器为每个客户端连接使用一个新线程,因此通过切换到此模型,您仍然可以从类似于使用 OnConnect/OnDisconnect 事件的行为中受益。不管客户端是否使用keepalives,效果都是一样的。

    但是,此模型为您提供了更大的灵活性,因为现在您可以在服务器中启用线程池(通过将 TIdSchedulerOfThreadPool 分配给 TIdHTTPServer.Scheduler 属性),然后可以跨多个客户端连接重用 DB 对象随着时间的推移使用相同的线程。

    TIdThreadWithTask 派生一个新类,重写其BeforeExecute() 方法以初始化COM 并创建DB 对象,并重写其AfterExecute() 方法以释放DB 对象并释放COM。将此类分配给调度程序的 ThreadClass 属性。

    要访问OnCommand... 事件中的DB 对象,请将AContext.Yarn 属性类型转换为TIdYarnOfThread,然后将其Thread 属性类型转换为您的派生类,然后您可以根据需要访问其成员。

    您仍然可以派生自定义 TIdServerContext 类来处理每个客户端的数据(Indy 不实现上下文池),并根据需要在每个请求的基础上使用 DB 对象。只需将 DB 对象的创建/销毁与上下文类分开即可。

    【讨论】:

    • + 另一个用于大量编辑的虚拟 1 :-) 这极大地帮助了我。
    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2011-11-27
    • 2012-01-30
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多