防止ADO连接SQL Server时的隐式连接

ado|server

防止ADO连接SQL Server时的隐式连接
Report Date:   2002/9

Prepared by:     郑            昀

Article last modified on 2002-9

The information in this article applies to:

ü         Microsoft SQL Server 2000,7.0

ü         Microsoft ADO 2.5
问题陈述:
数据库服务器:Microsoft SQL Server 2000以及7.0;

数据库服务器补丁:Microsoft SQL Server 2000 ServicePack1;

ADO名称:Microsoft Data Access - ActiveX Data Objects 2.5 Type Library

ADO版本:2.61.7326.0

 

执行下面的VB代码时,我们的开发人员产生了疑问:

 cnn.Open "Provider=SQLOLEDB.1;

Persist Security Info=False;User ID=sa;

Initial Catalog=freemail;Data Source=svr;ConnectionTimeout=10", "", "", -1
       sql = "select * from users"

    Set rs = cnn.Execute(sql)
      Set rs2 = cnn.Execute(sql)
      Set rs3 = cnn.Execute(sql)

执行这段代码时,在SQL Server Profiler中看到,每个sql语句执行之前都会有一个Audit Login事件。而Audit Login事件的解释是:“收集自跟踪启动后发生的所有新的连接事件,例如客户端请求连接到运行 Microsoft SQL Server 实例的服务器”。也就是说,用Connection对象连接SQL Server之后,每次执行sql语句时仍然会重新建立一次连接,即使用的是同一个Connection?!

建立连接的事件探查记录(按时间顺序)为:

 

EventClass

Text Data

TraceStart

 

Audit Login

(第一次连接)

-- network protocol: LPC

set quoted_identifier on

set implicit_transactions off

set cursor_close_on_commit off

set ansi_warnings on

set ansi_padding on

set ansi_nulls on

set concat_null_yields_null on

set language 简体中文

set dateformat ymd

set datefirst 7

SQL:Stm tStarting

Select * from users

Audit Login

(第2次连接)

-- network protocol: LPC

set quoted_identifier on

set implicit_transactions off…略

SQL:Stm tStarting

Select * from users

Audit Login

(第3次连接)

-- network protocol: LPC

set quoted_identifier on

set implicit_transactions off…略

SQL:Stm tStarting

Select * from users

Audit Logout

 

Audit Logout

 

Audit Logout

 

TraceStop

 

 

而如果每句cnn.Execute后面加上rs.close(),则每个execute之前不会有Audit Login事件,而是连续的3个SQL:StmtStarting事件。

这样频繁建立物理连接,是否会影响性能?照例说应该重用同一个连接才对呀?
Cause:
这种情况叫做隐式登录。

当set一个ADO.Recordset对象接收ADO.Connection.Execute返回的记录集时,就会出现隐式登录,再次和数据库服务器建立一次物理连接,而且这个连接还没有办法重用,也不能池化。

这个的原因是:

Because the SQL Server OLE DB provider doesn't permit more than one set of results to be pending on a connection where the results are being returned by means of a forward-only, read-only (default-resultset) cursor, the provider needs to create an additional SQL Server connection to execute a second command on the connection. The provider will only do this implicitly if the Data Source property DBPROP_MULTIPLECONNECTIONS is set to VARIANT_TRUE.

 

可以参考微软的KB文档:

http://support.microsoft.com/default.aspx?scid=kb;EN-GB;q271128&GSSNB=1

《PRB: Implicit Connections Created by the SQL Server OLE DB Provider (SQLOLEDB) Are Not Pooled》

 
【不会重复建立数据库连接的代码片断】:
 
通过改变ADO.Recordset的属性避免隐式登录 
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
cn.open ..........

 

rs.CursorType = adOpenStatic

rs.ActiveConnection = cn
rs.Open "select * from orders"

rs.CursorType = adOpenStatic
rs2.ActiveConnection = cn
rs2.Open "select * from orders"

看来,确实如微软所说的,只有接收默认的记录集时才会发生隐式连接。如果设置ADO.Recordset为其它类型,如静态集,就不会发生这个问题。

当然,默认的记录集的属性forward-only、read-only情况执行速度最快。

 

Writen by zhengyun@tomosoft.com

 

本文档所包含的信息代表了在发布之日,ZhengYun 对所讨论问题的当前看法,Zhengyun 不保证所给信息在发布之日以后的准确性。
本文档仅供参考。对本文档中的信息,Zhengyun 不做任何明示或默示的保证。

时间: 2024-10-27 06:12:20

防止ADO连接SQL Server时的隐式连接的相关文章

简述VC_ADO连接SQL SERVER时连接字符串的模式

一.连接SQL SERVER的第一种连接字串: 是针对数据库身份验证模式为"SQL SERVER 和 windows"而言, 连接字串为: CString strConn; strConn = "Provider = SQLOLEDB.1;\ Persist Security Info = true;\ User ID = sa;\ Password=123456;\ Initial Catalog = tempdb;\ Data Source = 127.0.0.1&quo

jTDS连接SQL Server时的Connection refused

     这几天从原来的服务器上check out出一个工程,使用的是Spring+Hibernate的轻量级架构,数据库是SQL Server2000,数据源使用的jtds.可是原本运行正常的程序无论如何也跑不起来,连接数据库时,总是出现java.sql.SQLException: "Network error IOException: Connection refused: connect".检查hibernate配置文件.使用查询分析器登陆数据库一切正常.于是google一下,发

SQL Server 2008处理隐式数据类型转换在执行计划中的增强

什么是隐式http://www.aliyun.com/zixun/aggregation/18278.html">数据类型转换: 当我们在语句的where 条件等式的左右提供了不同数据类型的列或者变量,SQL Server在处理等式之前,将其中一端的数据转换成跟另一端数值的数据类型一致,这个过程叫做隐式数据类型转换. 比如 char(50)=varchar(50), char(50)=nchar(50), int=float, int=char(20) 这些where 条件的等式都会触发隐

JDBC连接SQL Server时遇到的问题

问题描述 我运行怎么不行啊,出来如下东西,还请斑竹帮帮忙,帮我看看,谢谢啦!java.lang.ClassNotFoundException:com.microsoft.sqlserver.jdbc.SQLServerDriveratjava.net.URLClassLoader$1.run(UnknownSource)atjava.security.AccessController.doPrivileged(NativeMethod)atjava.net.URLClassLoader.find

sql server-jsp使用jdbc技术连接SQL Server2014时出现了一个问题,怎么解决?无法连接数据库

问题描述 jsp使用jdbc技术连接SQL Server2014时出现了一个问题,怎么解决?无法连接数据库 java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver 解决方案 SQL Server 连接JDBC时出现的问题jdbc连接sql server数据库问题分析jsp连接不上sql server数据库的问题分析 解决方案二: 下面是index.jsp首页. <%@ page language

visul studio 连接sql server失败

问题描述 visul studio 连接sql server失败 visual studio 2010 连接visual server 2008失败, 是否可以绕过连接直接操作数据库. 解决方案 SQL SERVER 连接失败SQL SERVER TELNET 连接失败连接到 SQL Server 2005 失败 解决方案二: 这个百度最快!相信我, 解决方案三: 我也是醉了,连不上数据库,你怎么操作,你这是在逗我么 解决方案四: 仔细看看是不是连接字符串写的不对,或者是用户名和密码不对

c#连接SQL Server的两种代码

#连接SQL Server的两种代码 连接字符串: <connectionStrings> <add name="conn" connectionString="user id=sa;Password=;initial catalog=Northwind;Server=YourSQLServer;Connect Timeout=30;" providerName="System.Data.SqlClient" /> <

在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)

error|server|程序 错误:"在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) ",       上述错误我遇到两种情况,一种是在打开打开SQL Server 2005时弹出的,另一种是在应用程序连接SQL Server 2005时出现的.归纳了一下,由以下几个原因: 1.数据库引擎没有启动.  

ado连接sql数据库-求大神帮忙,ado连接数据库sql server 2005,总是失败

问题描述 求大神帮忙,ado连接数据库sql server 2005,总是失败 #include #include #include #include #import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","ADOEOF") int main() { if(!AfxOleInit()) { AfxMessageBox("ca