IIS 之外的 Delphi 7 ADO 连接池

Posted

技术标签:

【中文标题】IIS 之外的 Delphi 7 ADO 连接池【英文标题】:Delphi 7 ADO connection pooling outside of IIS 【发布时间】:2009-04-09 14:15:28 【问题描述】:

我们有一个 Delphi 7 应用程序,它在 IIS6 中作为 ISAPI 扩展运行。该代码使用 ADO 连接到 MS SQL 2000 数据库并对数据库执行多次读取(无写入)。如果我在 SQL 分析器中查看审核登录和注销事件,我可以看到对应用程序的大量请求仅导致 1 个审核登录事件。但是,如果我从 IIS 外部运行相同的代码(即测试应用程序在 dll 中调用相同的方法),我会看到许多登录和注销事件。我的猜测是 IIS 正在执行一些自动连接池,而我没有做任何事情。出于性能原因,当我从 IIS 外部运行 dll 时,我希望看到相同的行为 - 在这种情况下,应用程序几乎慢 100%。当 dll 在 IIS 之外运行时,如何获得 ADO 连接池?

编辑 - 我实际上使用的是 SQL ole 提供程序。连接字符串如下所示:

Provider=SQLOLEDB.1;初始目录=%s;数据源=%s;密码=%s;用户 ID=%s;Pooling=True;Min Pool Size=5;Max Pool Size=50;Connection Lifetime =120

我尝试添加 Pooling=True 属性,但这并没有改变。此外,我了解到审核登录和注销事件不一定会因连接池而改变,因此我开始使用 Logins/sec、Logouts/sec 和 User Connections 性能计数器 (SQLServer:GeneralStatistics) 来确定是否发生连接池。从 IIS 内部,我看到许多登录/秒,而没有注销/秒。在 IIS 之外,我看到每秒有很多登录和注销,并且用户连接会波动(它在 IIS 中保持稳定)。

【问题讨论】:

【参考方案1】:

根据给出的信息很难说,但是连接池肯定是基于连接字符串的——如果连接字符串完全相同,那么连接可以被池化......听起来你的外部应用程序可能是修改连接字符串?

IIS 没有汇集 ADO 连接。它可能会缓存 ISAPI dll。您是否连续启动/停止您的外部应用程序?还是一次运行导致多个登录事件?

【讨论】:

DLL 在 IIS 之外只加载一次(我有一些静态代码可以验证这一点)。然而,连接字符串没有改变 - 相同的代码在两种情况下都在运行。 如果打开的连接总数下降到 0 则池基本被清除。与您的独立可执行文件相比,可能是 ISAPI dll 始终保持连接打开?

以上是关于IIS 之外的 Delphi 7 ADO 连接池的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 中的 BDE 与 ADO

delphi用ado连接oracle

delphi7能用firedac吗

delphi中ado连接sqlserver

Delphi 7:ADO,需要基本的编码示例

Delphi ADO MySQL直接连接方式