我们这里有一个应用程序,它使用COM + dll内的ODAC组件连接到Oracle Server 11g。
最近我们遇到了一个我们无法找到解决方案的问题。
出于某种原因,当我们的某些客户端的应用程序服务器的并发性太高时,一些dll开始挂起,他们必须终止该进程以恢复我们产品的可用性。为了在我们的办公室重现错误,我们创建了一个测试环境来强调应用服务器。我们启动30-50个程序来调用应用程序,并在一段时间后出现问题。
在服务器挂起后调试我们的DLL,表明对OCISessionBegin的任何后续调用都无法完成。没有生成错误。没有其他症状可见。
我们尝试执行的最后一行是:Check(OCISessionBegin(...));在OraClasses.pas
我们检查了数据库没有争用,没有锁定。
我们在客户端使用ODAC 6,但我们将其升级到上一版本并且问题仍然存在。我们必须使用Oracle Client 10连接到数据库11g,因为它们使用的是ODAC版本6.
非常感谢
答案 0 :(得分:0)
AFAIK您需要在这样的配置中使用OCI_EVENTS + OCI_THREADED
个属性集创建环境。
例如,以下是我们在Open Source direct Oracle access unit中初始化的方式:
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);
我怀疑您必须检查在ODAC中如何创建OCI环境。