我有一个包含许多服务的类,它们基本上称为数据库连接(DBISAM或通过ZEOS)。
我喜欢这个类在Web服务中可用,比如使用TidHTTPServer。我正在使用它的OnCommandGet事件并使用ARequestInfo:TIdHTTPRequestInfo; AResponseInfo:TIdHTTPResponseInfo用于发出请求和结果。
我创建了一个TObjectList来保存与此服务类相关的每个客户端的实例。每次完成调用都会创建并释放与数据库的连接,希望不会出现线程问题。
我想知道这是否正确。我没有使用TidHTTPServer的会话。在每个服务请求时,我找到TObjectList上的对象,该对象存储与该连接相关的信息。
我已查看过问题,但我没有得到所需的所有信息。
但是我不确定安全性,特别是当许多呼叫同时发生时。我一直经常使用它,每次大多数1次呼叫,因为很难同时测试多个连接。
我想知道这是否是正确的方法,或者如果没有,我如何实现一个“桥梁”来安全地调用我的类(我在这个类上创建了一个QueryActivity,模仿COM查询样式)传递请求和返回参数。
Delphi XE2 - Indy 10.5.8
答案 0 :(得分:4)
Indy TCP服务器类(如tTIdHTTPServer)可以选择分配特定于应用程序的上下文类。此类包含有关客户端的特定于连接的信息,可以使用自定义属性进行扩展,以承载特定于应用程序的信息。为此,请从TIdServerContext创建一个子类,并将该类分配给服务器的ContextClass。
如果请求之间的连接保持活动(建议保存资源),则此上下文将保留特定于应用程序的客户端信息。
Indy还允许迭代所有连接的连接上下文的列表,例如支持广播消息或收集信息。
Stackoverflow上的示例:
How to track number of clients with Indy TIdTCPServer
How do I send a command to a single client instead of all of them?
答案 1 :(得分:1)
处理线程并因此注意线程安全,你必须始终关注目标。
MultiUser数据库是线程安全的,SingleUser不是
有些是线程安全的,有些则不是。如果您不知道,请将它们视为不是线程安全的
在您的情况下(希望您拥有一个多用户数据库),每个线程使用一个连接/查询实例是安全的。
如果您想加快应用,请使用ObjectPool连接和查询实例。
出于测试目的,您可以构建一个小型客户端,在循环中执行大量请求并运行此客户端的多个实例。