zoukankan      html  css  js  c++  java
  • 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自己接解决了?

  • 相关阅读:
    POJ 1265 Pcik定理
    POJ 1380 坐标旋转
    POJ 1788
    POJ 3714 平面最近点对
    POJ 1905 二分
    POJ 1151 矩形面积并
    POJ 1654 多边形面积
    ZOJ 1010 判断简单多边形+求面积
    about work
    Python 打印 不换行
  • 原文地址:https://www.cnblogs.com/lzl_17948876/p/14211266.html
Copyright © 2011-2022 走看看