VB6 ADO连接池技术

4
我们公司有很多VB6应用程序。我们正在尝试调试一个随机的SQL超时错误,并在Audit Login事件上使用SQL Server Profiler进行跟踪。我们注意到连接是非池化的。我们使用SQLOLEDB提供程序与SQL Server 2000和2005。我在互联网上搜索,发现所有内容都说连接默认情况下在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个回答

5

每次调用都处理连接可能会防止连接池的使用

...对于每个唯一用户,至少实例化一个 Connection 对象——始终如此。否则,当该字符串的最后一个 Connection 对象关闭时,池将被销毁。

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


0

我在应用程序启动时打开了一个连接,并保持整个应用程序运行期间一直处于打开状态。第二次打开和关闭连接后开始进行连接池化。


0

你提到你正在尝试追踪一个随机的超时问题。我也遇到过类似的问题,通常是在执行返回大量行的SELECT语句时。有两个建议:

Cnn.CursorLocation=ADODB.adUseServer

另一个选项是adUseClient - 我相信adUseServer可以让我的查询更快,从而减少超时的可能性。我相信这是在打开连接之前完成的。

Cnn.CommandTimeout=0

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

如果语法不太正确,请见谅,我是从一些C++代码中剪切的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接