使用多线程时如何使用Delphi设计时FireDac TFDQuery?
我想使用组件编辑器设计我的使用多线程时如何使用Delphi设计时FireDac TFDQuery?,delphi,firedac,Delphi,Firedac,我想使用组件编辑器设计我的TFDQuery,即在设计期间设置SQL字符串、选项等,然后在线程中使用查询 我的问题是,每个正在运行的线程实例都需要它自己的查询实例,否则它就不会是线程安全的 我是否应该在线程开始运行时克隆查询,即在线程的Execute方法中克隆查询,然后设置其连接?如果是,如何克隆?还是有更好的方法 感谢您如中所述: …在线程打开查询并完成其处理之前, 应用程序无法在中使用此查询和连接对象 另一条线。类似地,线程启动事务后 在事务完成之前,应用程序无法使用此 事务和其他线程中的连接
TFDQuery
,即在设计期间设置SQL字符串、选项等,然后在线程中使用查询
我的问题是,每个正在运行的线程实例都需要它自己的查询实例,否则它就不会是线程安全的
我是否应该在线程开始运行时克隆查询,即在线程的Execute方法中克隆查询,然后设置其连接?如果是,如何克隆?还是有更好的方法
感谢您如中所述:
…在线程打开查询并完成其处理之前,
应用程序无法在中使用此查询和连接对象
另一条线。类似地,线程启动事务后
在事务完成之前,应用程序无法使用此
事务和其他线程中的连接对象
而且:
标准的简化是为每个线程创建和使用一个
使用数据库的专用连接对象
因此,最简单的解决方案是每个工作线程有一个单独的连接。如果您在同一个datamodule上使用FireDAC(连接、事务和查询)组件,那么最简单的解决方案可能是为每个工作线程创建整个datamodule的单独实例。谢谢您的回答!数据模块大约有5个查询,在高峰时间平均每秒调用5次。我有点担心每次创建数据模块所需的时间。我会做一些测试并在这里报告。欢迎。代替为每个请求创建和销毁数据模块,您可以考虑使用连接池来保持连接,以便它们可以被重用。我的想法是使用FireDac提供的连接池,但您的建议可能只是一点额外的工作,我仍然可以使用FireDac连接池。从链接文档中,要实现自动连接池,似乎只需将连接的
Pooled
参数设置为True
。在Samples目录中有一个名为Pooling
的演示,演示了这一点。再次感谢TOndrej。我使用了连接池,它100%有效。还测试了创建数据模块,并在每次创建线程时释放它,即没有“数据模块池”,在循环100次的过程中,在我缓慢的笔记本电脑上每次创建和释放大约需要10毫秒,所以要坚持下去。