VB6 ADO连接池

时间:2009-01-09 12:57:28

标签: vb6 ado connection-pooling

我们公司有一堆VB6应用程序。我们正在尝试调试随机SQL超时错误,并在审核登录事件上使用SQL Server Profiler进行跟踪。我们注意到连接是以非汇集方式进入的。我们将SQLOLEDB提供程序与SQL Server 2000&我搜索了互联网,我遇到的所有内容都表明默认情况下SQLOLEDB提供程序中存在连接,但我们没有看到这一点。下面是我们用于连接数据库的代码。我们确实需要将这些连接合并,因为我们认为这可能是我们的随机超时错误的问题。任何人都可以阐明为什么连接池不起作用以及任何使其工作的方法?感谢。

Dim cnn As New ADODB.Connection
cnn.ConnectionString = "Provider=SQLOLEDB;Data Source=xxx;Catalog=xxx;User ID=xxx Password=xxx;"
Call cnn.Open
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * FROM [Table]"
Dim rs As New ADODB.RecordSet
Call rs.Open(cmd, , adOpenStatic, adLockOptimistic)
While Not rs.eof
    'Do stuff
    Call rs.MoveNext
Wend
'Close and Dispose connection here

3 个答案:

答案 0 :(得分:5)

在每次通话时处理连接可能会阻止合并

  

...至少一个Connection实例   为每个唯一实例化的对象   用户 - 始终。否则,游泳池   将在最后一次被摧毁   该字符串的连接对象是   闭合。

http://msdn.microsoft.com/en-us/library/ms810829.aspx

答案 1 :(得分:0)

我搞砸了并在app启动时打开了一个连接,并在应用程序运行的整个过程中保持打开状态。连接池在第二次打开和关闭连接后开始。

答案 2 :(得分:0)

您提到您正在尝试追踪随机超时问题。我有同样的,通常当我做一个返回很多行的SELECT时。两件事:

Cnn.CursorLocation = ADODB.adUseServer

(另一个选项是adUseClient) - 我相信adUseServer给了我更快的查询,这减少了超时的可能性。你打开连接之前就这样做了,我相信。

Cnn.CommandTimeout = 0

在open()之前,告诉它你想要一个无限超时。我认为默认超时类似于30秒,这对某些查询来说太短了。 CommandTimeout将用于Recordset查询。如果您使用Command对象,它有自己的CommandTimeout成员,它似乎不会从Connection继承(即,我在执行命令之前设置它)。

如果语法不正确,我很抱歉,我正在削减一些C ++代码。