Delphi TIdTCPServer处理多个请求

时间:2014-09-26 22:57:24

标签: delphi ado indy tcpserver

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

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

有时我会收到此错误:Operation cannot be performed while executing asynchronously。这是由ADO提出的。我认为TCP服务器是异步工作的,同时多次访问ADODataset是个问题。我该怎么办?我是否应该将传入的请求放入列表并逐个处理它们,直到列表清除为止?

1 个答案:

答案 0 :(得分:3)

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

ADO是一组公寓线程的COM对象。除非你整理它们,否则你不能跨越线程边界共享它们。

您必须:

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

  2. 将查询委托给运行查询的专用线程,并将结果发送回相应的线程。

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

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