2

我有一门课程,其中包含许多基本上调用数据库连接(DBISAM 或通过 ZEOS)的服务。

我正在使此类在 Web 服务中可用,例如使用 TidHTTPServer。我正在使用它的 OnCommandGet 事件并使用 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo:TIdHTTPResponseInfo 发出请求和结果。

我创建了一个 TObjectList 来保存与此服务类相关的每个客户端的实例。每次调用完成时都会创建和释放与数据库的连接,希望不会出现线程问题。

我想知道这是否是正确的方法。我没有使用来自 TidHTTPServer 的会话。在每个服务请求中,我都会在 TObjectList 上找到存储与该连接相关的信息的对象。

我查看了问题,但没有得到我需要的所有信息。

但是我不确定安全性,特别是当许多电话可以同时发生时。我一直经常使用它,主要是每次调用 1 次,因为很难同时使用多个连接进行测试。

我想知道这是否是正确的方法,或者如果不是,我怎样才能实现一个“桥”来安全地调用我的类(我在这个类上创建了一个 QueryActivity,模仿 COM 查询风格)传递请求并返回参数.

德尔福 XE2 - 印地 10.5.8

4

2 回答 2

4

Indy TCP 服务器类(如 tTIdHTTPServer)可以选择分配特定于应用程序的上下文类。此类包含有关客户端的特定于连接的信息,并且可以使用自定义属性进行扩展以携带您的应用程序特定信息。为此,从 TIdServerContext 创建一个子类,并将该类分配给服务器的 ContextClass。

如果请求之间的连接保持活动状态(建议这样做以节省资源),则此上下文将在其生命周期内保留特定于应用程序的客户端信息。

Indy 还允许迭代所有连接的连接上下文的列表,例如支持广播消息或收集信息。

Stackoverflow 上的示例:

如何使用 Indy TIdTCPServer 跟踪客户端数量

Indy 10 TCP 服务器

如何将命令发送到单个客户端而不是所有客户端?

于 2013-07-06T06:41:25.067 回答
1

处理线程并因此注意线程安全,您必须始终关注目标。

数据库

多用户数据库是线程安全的,单用户不是

数据库访问组件

有些是线程安全的,有些不是。如果您不知道,请将它们视为不是线程安全的


在您的情况下(希望您有一个多用户数据库),每个线程使用一个连接/查询实例是安全的。

如果您想加快应用程序的速度,请使用ObjectPool进行连接和查询实例。

出于测试目的,您可以构建一个小型客户端,在循环中执行大量请求并运行该客户端的多个实例。

于 2013-07-05T23:12:12.013 回答