Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多线程时如何使用Delphi设计时FireDac TFDQuery?_Delphi_Firedac - Fatal编程技术网

使用多线程时如何使用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毫秒,所以要坚持下去。