我正在使用 TidTCPServer 和 TidTCPClient 在 delphi 中开发消息系统。
首先,所有客户端都使用用户名和密码登录。服务器使用ADO组件在SQL Server中搜索用户数据。此后,客户端每 10 秒向服务器发送多个请求,告诉服务器他们在线并获取联系人列表的状态。所有这些请求最终都会读取或修改 SQL 表。
有时我会收到此错误:异步执行时无法执行操作
。它是由 ADO 提出的。我认为 TCP 服务器异步工作,同时对 ADODataset 进行多次访问是问题所在。我应该怎么办?我是否应该将传入的请求放入一个列表中并逐一处理它们,直到列表清晰为止?
最佳答案
TIdTCPServer
是一个多线程组件。每个客户端都在自己的工作线程中运行。
ADO 是一组单元线程 COM 对象。除非对它们进行编码(marshal),否则您无法跨线程边界共享它们。
您必须:
为每个线程提供自己的数据库连接和查询组件。 (可选)将对象放入池中以控制一次运行的事件连接/查询的数量。当从池中取出连接时,池可以处理必要的编码。
将查询委托(delegate)给专用线程,该线程运行查询并将结果发送回适当的线程。
切换到另一个更好支持线程访问的数据库框架,例如 dbExpress。
就我个人而言,我使用 #3 的共用版本。当客户端需要执行查询时,它从池中获取一个TSQLConnection
(如果需要,将其连接到数据库),创建一个TSQLQuery
对象,执行查询,读取结果,然后将 TSQLConnection
放回池中。该池有一个专门的线程来监视哪些连接正在使用,并关闭空闲一段时间的连接。
关于Delphi TIdTCPServer 处理多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26069455/