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自己接解决了?

posted on 2020-12-30 14:22  黑暗煎饼果子  阅读(59)  评论(0编辑  收藏  举报