FireDAC在Service下多线程异常的问题
这里不讨论连接池, 只说多线程私有连接
FireDAC本身是支持多线程的, 在普通EXE里工作的很好, 每个线程一个私有数据库连接, 频繁创建释放工作的很稳定
但是同样的代码
如果使用RDBMS连接的数据库(比如mysql/ora), 在Service下, 就会出问题, 如果创建释放的很频繁(不要问为什么不用连接池, 测试, 这是测试!), 比如2个线程, 每个线程连续不停的创建-连接数据库-释放
就会很大概率在创建或释放的时候报一个地址错误, 以后在每次创建数据库连接对象时都会报out of memory错误
补充一下, 只有使用RDBMS连接的数据库才会出问题, 其他的比如SQL Server就没事, 比如mysql连接出错时, SQL Server的连接创建释放一切正常
跟踪了一下, 大概可能是在RDBMS对象里使用了一个被释放的对象导致的
初步猜测应该是RDBMS内部使用了Synchronize之类的同步方法来保证线程安全, 而Synchronize在Server下是不可靠的...(具体不解释了, 查查VCL的Servier工作机制就知道, 主线程只是处理简单消息)
所以, 目前临时解决办法是, 自己加了互斥来保证多线程不会同时触发connection的create或free (执行时不受影响的), 至于彻底解决, 这个暂时还没其他想法, 也许等后几个版本的Delphi自己接解决了?
--------------------------------------------------------------------------------------------------
作者:黑暗煎饼果子
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
--------------------------------------------------------------------------------------------------