0

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

最近我们面临一个问题,我们无法找到解决方案。

由于某些原因,当我们的一些客户端的应用服务器并发太高时,一些dll开始挂起,他们不得不杀死进程来恢复我们产品的可用性。为了在我们的办公室重现错误,我们创建了一个测试环境来给应用程序服务器施加压力。我们启动了 30-50 个调用应用程序的程序,一段时间后问题出现了。

在服务器挂起后调试我们的 DLL,表明对 OCISessionBegin 的任何后续调用都无法完成。不会产生错误。没有其他症状可见。

我们尝试执行的最后一行是:Check(OCISessionBegin(...)); 在 OraClasses.pas

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

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

非常感谢

4

1 回答 1

0

AFAIK,您需要OCI_EVENTS + OCI_THREADED在这样的配置中创建具有两个属性集的环境。

例如,下面是它在我们的开源直接 Oracle 访问单元中的初始化方式:

  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);

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

于 2013-09-25T05:13:12.673 回答