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

  • 相关阅读:
    DOM节点的创建
    js中css样式
    js中面向对象
    js
    this是什么!
    事件
    Dom
    逻辑运算和作用域的问题
    Json
    数组
  • 原文地址:https://www.cnblogs.com/lzl_17948876/p/14211266.html
Copyright © 2020-2023  润新知