防止ADO连接时的隐式连接

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
防止ADO连接SQLServer时的隐式连接
ReportDate:  2002/9

Preparedby:    郑           昀

Articlelastmodifiedon2002-9

Theinformationinthisarticleappliesto:

ü        MicrosoftSQLServer2000,7.0

ü        MicrosoftADO2.5
问题陈述:
服务器:MicrosoftSQLServer2000以及7.0;

数据库服务器补丁:MicrosoftSQLServer2000ServicePack1;

ADO名称:MicrosoftData-ActiveXDataObjects2.5TypeLibrary

ADO版本:2.61.7326.0

 

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

 cnn.Open"Provider=SQLOLEDB.1;

PersistSecurityInfo=False;UserID=sa;

InitialCatalog=freemail;DataSource=svr;ConnectionTimeout=10","","",-1
      sql="select*fromusers"

   Setrs=cnn.Execute(sql)
     Setrs2=cnn.Execute(sql)
     Setrs3=cnn.Execute(sql)

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

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

 

EventClass

TextData

TraceStart

 

AuditLogin

(第一次连接)

--networkprotocol:LPC

setquoted_identifieron

setimplicit_transactionsoff

setcursor_close_on_commitoff

setansi_warningson

setansi_paddingon

setansi_nullson

setconcat_null_yields_nullon

setlanguage简体中文

setdateformatymd

setdatefirst7

SQL:StmtStarting

Select*fromusers

AuditLogin

(第2次连接)

--networkprotocol:LPC

setquoted_identifieron

setimplicit_transactionsoff…略

SQL:StmtStarting

Select*fromusers

AuditLogin

(第3次连接)

--networkprotocol:LPC

setquoted_identifieron

setimplicit_transactionsoff…略

SQL:StmtStarting

Select*fromusers

AuditLogout

 

AuditLogout

 

AuditLogout

 

TraceStop

 

 

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

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

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

这个的原因是:

BecausetheSQLServerOLEDBproviderdoesn'tpermitmorethanonesetofresultstobependingonaconnectionwheretheresultsarebeingreturnedbymeansofaforward-only,read-only(default-resultset)cursor,theproviderneedstocreateanadditionalSQLServerconnectiontoexecuteasecondcommandontheconnection.TheproviderwillonlydothisimplicitlyiftheDataSourcepropertyDBPROP_MULTIPLECONNECTIONSissettoVARIANT_TRUE.1
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
个人分类: 数据库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭