可能这个线程不仅仅特定于数据库......
我编写了一个项目,其中由Web界面调用的SOAP服务器在数据库上运行某些操作,然后回答客户端。 我正在使用Delphi 2007和MSSQL。
我在Windows XP上测试这个项目,我尝试在IIS内部部署我的SOAP服务器(比如ISAPI dll或者像CGI exe)或者像winnt服务一样。
在任何情况下,有时我会遇到数据库连接问题,我说"有时"因为错误不是常数而是偶然的。 例外情况恰好在数据库连接的开放中。
打开/关闭数据库我使用这个简单的代码(我已经在许多应用程序中使用过没有问题):
procedure TDataMod1.OpenDB;
begin
try
if not ADOConnection1.Connected then
begin
ADOConnection1.Open;
end;
except
on E:Exception do
begin
raise Exception.Create('Exception opening DB: '+E.Message)
end;
end;
end;
主要是eexception在模块' WebService.dll'中的地址01173E02处发生了可怕的访问冲突。读取地址00000058",否则也是一个奇怪的"当对象打开时不允许操作"即使我测试了Connected值(我也尝试使用ADOConnection1.State = [ADODB.stClosed]。
当发生此错误时,我会收到许多异常,并且SOAP服务器不可用会变得更糟。
一个特殊的功能是在Windows 2003上进行一些测试(因此IIS 6)它更稳定,并且连接到数据库没有错误。
你能就这个问题给我任何建议吗?
还提示::哪个是连接到MSSQL的最佳提供商? SQL Native Client或OLE DB Provider?
由于 再见
答案 0 :(得分:0)
我们正在为传统的Delphi应用程序执行此操作,我们遇到了类似的问题。
我怀疑您的问题可能是SOAP服务器同时收到多个请求,并且您正在使用一个ADO连接来为它们提供服务。 SOAP组件按请求生成一个线程。因此,如果两个请求在您尝试使用已经使用或已经打开的组件的同时或多或少地命中您的服务器。
我们必须手动创建自己的连接池机制,然后将线程分配给未使用的连接组件。
不幸的是,Delphi在这方面远远落后于Java和C#,所以你必须在这里开发一些样板代码。有关更多信息,请参阅此链接How do I make connection pooling work in DBX?。祝你好运!