Delphi TIdTCPServer 处理多个请求

标签 delphi ado indy tcpserver

我正在使用 TidTCPServer 和 TidTCPClient 在 delphi 中开发消息系统。

首先,所有客户端都使用用户名和密码登录。服务器使用ADO组件在SQL Server中搜索用户数据。此后,客户端每 10 秒向服务器发送多个请求,告诉服务器他们在线并获取联系人列表的状态。所有这些请求最终都会读取或修改 SQL 表。

有时我会收到此错误:异步执行时无法执行操作。它是由 ADO 提出的。我认为 TCP 服务器异步工作,同时对 ADODataset 进行多次访问是问题所在。我应该怎么办?我是否应该将传入的请求放入一个列表中并逐一处理它们,直到列表清晰为止?

最佳答案

TIdTCPServer 是一个多线程组件。每个客户端都在自己的工作线程中运行。

ADO 是一组单元线程 COM 对象。除非对它们进行编码(marshal),否则您无法跨线程边界共享它们。

您必须:

  1. 为每个线程提供自己的数据库连接和查询组件。 (可选)将对象放入池中以控制一次运行的事件连接/查询的数量。当从池中取出连接时,池可以处理必要的编码。

  2. 将查询委托(delegate)给专用线程,该线程运行查询并将结果发送回适当的线程。

  3. 切换到另一个更好支持线程访问的数据库框架,例如 dbExpress。

就我个人而言,我使用 #3 的共用版本。当客户端需要执行查询时,它从池中获取一个TSQLConnection(如果需要,将其连接到数据库),创建一个TSQLQuery对象,执行查询,读取结果,然后将 TSQLConnection 放回池中。该池有一个专门的线程来监视哪些连接正在使用,并关闭空闲一段时间的连接。

关于Delphi TIdTCPServer 处理多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26069455/

相关文章:

delphi - Inno Setup ComponentsList OnClick事件

multithreading - 在 TListView 中更新每个线程的计时器,而不会造成 CPU 过载

postgresql - 在 VBA 中使用 ADO 连接到 PostgreSQL

oracle - 使用 OraOLEDB 提供商部署应用程序

c++ - 使用 ADO 插入单个记录的有效方法

delphi - Indy10 GMTToLocalDateTime 问题

delphi - 如何更改默认的delphi停靠窗体标题高度?

delphi - 通过 Delphi 的 API 发送短信

Delphi indy 远程主机UDP客户端/服务器

delphi - 如何以编程方式更改 Windows 桌面主题