OCISessionBegin挂起在多线程COM+;应用程序[Delphi+;ODAC+;Oracle]

OCISessionBegin挂起在多线程COM+;应用程序[Delphi+;ODAC+;Oracle],oracle,delphi,odac,Oracle,Delphi,Odac,这里有一个应用程序,它使用COM+DLL中的ODAC组件连接到Oracle Server 11g 最近我们面临着一个无法找到解决办法的问题 出于某种原因,当我们的一些客户机上的应用程序服务器的并发性太高时,一些DLL开始挂起,它们必须终止该过程以恢复我们产品的可用性。为了在办公室重现错误,我们创建了一个测试环境来强调应用服务器。我们启动30-50个程序调用应用程序,一段时间后问题出现 在服务器挂起后调试DLL表明,任何后续调用OCISessionBegin都无法完成。没有生成错误。没有其他明显症

这里有一个应用程序,它使用COM+DLL中的ODAC组件连接到Oracle Server 11g

最近我们面临着一个无法找到解决办法的问题

出于某种原因,当我们的一些客户机上的应用程序服务器的并发性太高时,一些DLL开始挂起,它们必须终止该过程以恢复我们产品的可用性。为了在办公室重现错误,我们创建了一个测试环境来强调应用服务器。我们启动30-50个程序调用应用程序,一段时间后问题出现

在服务器挂起后调试DLL表明,任何后续调用OCISessionBegin都无法完成。没有生成错误。没有其他明显症状

我们尝试执行的最后一行是:Check(OCISessionBegin(…);关于ora.pas

我们检查了数据库没有争用,没有锁

我们正在客户机上使用ODAC 6,但我们将其升级到最新版本,问题依然存在。我们必须使用Oracle客户端10连接到数据库11g,因为我们使用的是ODAC的版本6


非常感谢

在这样的配置中,您需要使用
OCI\u事件+OCI\u线程
属性集创建您的环境

例如,以下是在我们的


我怀疑您必须检查您的OCI环境是如何在ODAC中创建的。

非常感谢Arnaud,但我刚刚检查了ODAC源代码,并且正如您所说,已使用
OCI\u事件+OCI\u线程化
创建了环境。@zedmartins太糟糕了!:(代码中每个线程是否有一个连接?每个线程在datamodule激活事件上打开一个新的数据库连接。
  fEnvironmentInitializationMode := OCI_EVENTS or OCI_THREADED;
  ...
  with OCI do
  try
    if fEnv=nil then
      // will use UTF-8 encoding by default, in a multi-threaded context
      // OCI_EVENTS is needed to support Oracle RAC Connection Load Balancing
      EnvNlsCreate(fEnv,Props.EnvironmentInitializationMode,
        nil,nil,nil,nil,0,nil,OCI_UTF8,OCI_UTF8);