【问题标题】:How to enable OLEDB resource pooling in a Delphi 7 app如何在 Delphi 7 应用程序中启用 OLEDB 资源池
【发布时间】:2010-10-18 19:54:21
【问题描述】:

需要做什么才能在 Delphi 7 应用程序中启用池化?我的连接字符串是:

Provider=SQLOLEDB.1;Initial Catalog=%s;Data Source=%s;Password=%s;User ID=%s;OLE Db Services=-1

我可以通过查看 SQLServer:GeneralStatistics UserConnections 性能计数器来判断连接池没有实现 - 当我的应用程序运行时它会大幅波动。通过连接池,我希望它能够达到稳定状态。此外,我发现 Logins/sec 和 Logouts/sec 计数器都非常高 - 如果使用连接池,Logouts/sec 将为零或接近零。

在搜索中,我发现了这篇关于资源池的文章:

http://www.ddj.com/database/184416942

它建议“如果您使用 ATL 在 OLEDB SDK(或 COM)级别工作,则必须编写更多代码”(除了将 OLE Db Services=-1 添加到连接字符串)以获得连接池:

CDataSource 数据库; CDBPropSet dbinit(DBPROPSET_DBINIT);

dbinit.AddProperty(DBPROP_AUTH_USERID, "我的名字); dbinit.AddProperty(DBPROP_INIT_DATASOURCE, "MyServer); dbinit.AddProperty(DBPROP_INIT_CATALOG, "MyDb); dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4); dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033); dbinit.AddProperty(DBPROP_INIT_OLEDBSERVICES, (long)DBPROPVAL_OS_ENABLEALL); HRESULT hr = db.OpenWithServiceComponents(_T("sqloledb"), &dbinit);

不幸的是,该代码对我来说是希腊语,我不确定如何将其翻译成 Delphi(或者是否有必要)。

我也小心不要更改连接字符串。关于启用资源池我可能还需要做些什么的任何建议?

【问题讨论】:

    标签: delphi oledb connection-pooling


    【解决方案1】:

    您需要始终保持一个连接实例打开...如果它降至零,则 ADO 将重新建立连接以验证用户身份。

    【讨论】:

    • 但是连接池的功能不就是让代码经常打开和关闭连接而不真正关闭到服务器的连接吗?如果我在 IIS 中运行相同的代码,我会看到它创建了 2 个与 Db 服务器的连接,这些连接持续了应用程序的生命周期。
    • 更多的是对现有的最近活动连接的重用。假设计数归零……您认为池应该保持对数据库的连接打开多长时间?在零时,我相信它开始进行清理并最终结束所有连接。我还没有测试确切的时间范围。
    • 谢谢 Darian,这也可以解释为什么 IIS 会打开一些连接。如果测试证明不是这样,我会将其标记为答案并进行编辑。
    【解决方案2】:

    您没有提到它,但是您是否使用 Delphi 的 ADO 实现(dbGo for Delphi 7,IIRC)进行数据访问?如果是这样,您是否通过同一个 TADOConnection 连接所有内容?如果是这样,它应该为您的应用程序进行池化(这意味着您的应用程序的一个运行副本正在使用与数据库服务器的一个连接)。

    【讨论】:

    • 是的,我在 Delphi 7 中使用 dbGo。在整个代码中没有共享相同的连接,我希望池可以提供帮助。
    猜你喜欢
    • 2010-10-16
    • 2011-12-25
    • 2019-11-01
    • 1970-01-01
    • 2011-01-18
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多