关于SQL线程、进程、连接、.net连接池等方面的资料

1、查看sql server 数据库连接数:

select * from sysprocesses where dbid in

(select dbid from sysdatabases where name='FGTDB')

将所有连接CoachMag这个数据库的连接记录都求出来。

sysprocesses这个表记录所有连接到SQL SERVER数据库的连接。

 

如果是查看某用户的连接则用,如查看sa的连接数:sp_who 'sa'

 

 

2、开始--程序--MS   SQLSERVER  

  --事件探察器(SQL   Profiler)  

  --文件  

  --新建--跟踪...  

  --设置要跟踪的服务器的信息(连接服务器)--确定  

  --设置跟踪的项目...  

  --然后数据库的调用情况就会显示出来  

   

  在跟踪项目设置中,如果不熟悉的话,一般用默认设置  

  筛选项目有几个可以注意一下:  

   

  1.DatabaseName   同于你要监测的数据库名(不过这个好像不起作用,我的电脑上设置无效)  

  2.DatabaseID       同于你要检测的数据库的dbid,可以用   select   db_id(N'你要监测的库名')得到dbid  

  3.ObjectName       同于你要监测的对象名,例如表名,视图名等  

  4.ObjectID           同于你要监测的对象的id,可以用   select   object_id(N'你要监测的对象名')得到id  

  5.Error                 同于错误,如果经常出现某个编号的错误,则针对此错误号  

  6.Seccess             同于0,失败,1,成功,如果是排错,就过滤掉成功的处理

 

 

3、查看进程

SELECT * FROM master..sysprocesses

select distinct net_address from master..sysprocesses

 

4、查看死锁的进程

select   *   from   sysprocesses   where   blocked   <> 0

 

 

5、

create   proc   p_getlinkinfo  

  @dbname   sysname=null, --要查询的数据库名,默认查询所有数据库的连接信息  

  @includeip   bit=0 --是否显示IP地址,因为查询IP地址比较费时,所以增加此控制  

  as  

  declare   @dbid   int  

  set   @dbid=db_id(@dbname)  

   

  create   table   #tb(id   int   identity(1,1),dbname   sysname,hostname   nchar(128),loginname   nchar(128),

net_address   nchar(12),net_ip   nvarchar(15),prog_name   nchar(128))  

  insert   into   #tb(hostname,dbname,net_address,loginname,prog_name)  

  select   distinct   hostname,db_name(dbid),net_address,loginame,program_name   from   master..sysprocesses  

  where   hostname<>''   and   (@dbid   is   null   or   dbid=@dbid)  

   

  if   @includeip=0   goto   lb_show     --如果不显示IP地址,就直接显示  

   

  declare   @sql   varchar(500),@hostname   nchar(128),@id   int  

  create   table   #ip(hostname   nchar(128),a   varchar(200))  

  declare   tb   cursor   local   for   select   distinct   hostname   from   #tb  

  open   tb  

  fetch   next   from   tb   into   @hostname  

  while   @@fetch_status=0  

  begin  

  set   @sql='ping   '+@hostname+'   -a   -n   1   -l   1'  

  insert   #ip(a)   exec   master..xp_cmdshell   @sql  

  update   #ip   set   hostname=@hostname   where   hostname   is   null  

  fetch   next   from   tb   into   @hostname  

  end  

   

  update   #tb   set   net_ip=left(a,patindex('%:%',a)-1)  

  from   #tb   a   inner   join   (  

  select   hostname,a=substring(a,patindex('Ping   statistics   for   %:%',a)+20,20)   from   #ip  

  where   a   like   'Ping   statistics   for   %:%')   b   on   a.hostname=b.hostname  

   

  lb_show:  

  select   id,数据库名=dbname,客户机名=hostname,用户名=loginname  

  ,网卡物理地址=net_address,IP地址=net_ip,应用程序名称=prog_name   from   #tb  

   

 

调用示例:

 

 

  /*--调用示例  

  --显示所有本机的连接信息  

  exec   p_getlinkinfo  

   

  --显示所有本机的连接信息,包含ip地址  

  exec   p_getlinkinfo   @includeip=1  

   

  --显示连接指定数据库的信息  

  exec   p_getlinkinfo   '客户资料'  

 

 

 

6、SQL Server 连接池 (ADO.NET)

http://msdn.microsoft.com/zh-cn/library/8xx3tyca.aspx

 

SqlConnection..::.ClearPool 方法 :

http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.clearpool.aspx

 

7、想更清楚了解到连接池的状况可以通过SQL的查询分析器执行存储过程sp_Who,它会列出当前的数据库进程,查看loginname、dbname可以区分用户的连接信息,但要注意的是登录查询分析器本身会使用两个连接,所以最好用另一个用户名登录查询分析器

exec sp_Who

 

使用此方法还有一个麻烦地方就是要经常按“执行查询”以更新进程信息。还有另一种方法个人认为较好的,通过控制面板→管理工具→性能,右击添加计算器,性能对象选择SQlServer:General Statistics(常规统计)然后计算器选择User Connections(用户连接)最后按“添加”就可以实时查看当前连接数。

 

 

 

8、C#连接池的详细分析:

http://www.25175.net/200808/html/2009-03/2213.html

使用连接池

 

连接到数据库服务器通常由几个需要软长时间的步骤组成。必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次连接,必须分析连接字符串信息,必须由服务器对连接进行身份验证,等等。

 

实际上,大部份的应用程序都是使用一个或几个不同的连接配置。当应用程序的数据量和访问量大的时候,这意味着在运行应用程序的过程中,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃。为了确保应用程序的稳定和降低性能成本,我们可以在ADO.NET中使用称为连接池的优化方法来管理维护连接。

www.25175.net

 

 

 

连接池可以减少创建连接的次数。定义最小连接数(固定连接数),当用户在连接上调用 Open,连接池就会检查池中是否有可用的连接。如果发现有连接可用,会将该连接返回给调用者,而不是创建新连接。应用程序在该连接上调用 Close 时,连接池会判断该连接是否在最小连接数之内,如果“是”会将连接回收到活动连接池中而不是真正关闭连接,否则将烧毁连接。连接返回到池中之后,即可在下一个 Open 调用中重复使用。

 

 

创建连接池

以下示例使用C# 连接SQL数据库:

 

class DbConn

    {

        //using System.Data;

        //using System.Data.SqlClient;

        private const int MaxPool = 10;         //最大连接数

        private const int MinPool = 5;          //最小连接数

        private const bool Asyn_Process = true; //设置异步访问数据库

        private const bool Mars = true;         //在单个连接上得到和管理多个、仅向前引用和只读的结果集(ADO.NET2.0)

        private const int Conn_Timeout = 15;    //设置连接等待时间

        private const int Conn_Lifetime = 15;   //设置连接的生命周期

        private string ConnString = "";         //连接字符串      

        private SqlConnection SqlDrConn = null; //连接对象

 

        public DbConn()//构造函数

        {

            ConnString = GetConnString();

            SqlDrConn = new SqlConnection(ConnString);

        }

 

        private string GetConnString()

        {

            return "server=localhost;"

                + "integrated security=sspi;"

                + "database=pubs;"

                + "Max Pool Size=" + MaxPool + ";"

                + "Min Pool Size=" + MinPool + ";"

                + "Connect Timeout=" + Conn_Timeout + ";"

                + "Connection Lifetime=" + Conn_Lifetime + ";"

                +"Asynchronous Processing=" + Asyn_Process + ";";

                //+ "MultipleActiveResultSets=" + Mars + ";";

        }

       

        public DataTable GetDataReader(string StrSql)//数据查询

        {                    

            //当连接处于打开状态时关闭,然后再打开,避免有时候数据不能及时更新

            if (SqlDrConn.State == ConnectionState.Open)

            {

                SqlDrConn.Close();                

            }

            try

            {

                SqlDrConn.Open();

                SqlCommand SqlCmd = new SqlCommand(StrSql, SqlDrConn);

                SqlDataReader SqlDr = SqlCmd.ExecuteReader();

                if (SqlDr.HasRows)

                {

                    DataTable dt = new DataTable();

                    //读取SqlDataReader里的内容

                    dt.Load(SqlDr);

                    //关闭对象和连接

                    SqlDr.Close();

                    SqlDrConn.Close();                    

                    return dt;

                }

                return null;

            }

            catch (Exception ex)

            {

                System.Windows.Forms.MessageBox.Show(ex.Message);          

                return null;

            }

            finally

            {        

                SqlDrConn.Close();

            }

        }

    }

通过调用 SqlDrConn.Open()方法打开连接,这时候连接池就会初始化并建立设定的最小连接数。想更清楚了解到连接池的状况可以通过SQL的查询分析器执行存储过程sp_Who,它会列出当前的数据库进程,查看loginname、dbname可以区分用户的连接信息,但要注意的是登录查询分析器本身会使用两个连接,所以最好用另一个用户名登录查询分析器。使用此方法还有一个麻烦地方就是要经常按“执行查询”以更新进程信息。还有另一种方法个人认为较好的,通过控制面板→管理工具→性能,右击添加计算器,性能对象选择SQlServer:General Statistics(常规统计)然后计算器选择User Connections(用户连接)最后按“添加”就可以实时查看当前连接数。

 

到了这里,连接池已经实现了,但问题往往会出现在运行过程中。如连接池的连接数满了该怎样处理?在这里我们应该合理设置连接字符串中的Connect Timeout属性和Connection Lifetime属性(上面有解释)延长等待时间,尽可能地在每次使用完连接之后调用Close方法关闭连接。但从中也有没法避免的,当连接数满了并且申请连接的时间超过设置连接等待的时间时,程序将会引发InvalidOperationExceptio异常,我们可以通过捕获此异常向用户界面提示“系统正忙,请稍后再连接……”之类的信息来缓解这种情况。此外,也有另一种方法来解决这种情况,就是利用ADO.NET 2.0 新特性“异步进程”,对数据库进行异步操作,确保连接能够及时调用Close方法关闭连接,这样能大大减少正在使用的连接数。。在每次创建、打开或关闭SqlConnection或关闭一个或所有连接池时,此示例中的性能计数器都会被更新。

 

 

使用方法:在连接字符串中加上Asynchronous Processing=true 表示使用异步处理操作。

 

当应用程序不再需要用到连接池的时候可以使用ClearPool 或 ClearAllPools方法清空连接池也可作重置连接池使用,方法如下:

 

         SqlConnection.ClearPool(SqlConnection connection) 清空关联的连接池

         SqlConnection.ClearAllPools() 清空所有连接池

调用上述方法,如果连接正在使用,连接池会做相应标记,等连接关闭时自动烧毁。

 

 

小结C#连接池

优点:当数据库操作和访问频繁的时候,减少创建连接和打开连接所耗的时间,提升数据库服务器的性能。

 

缺点:数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库,这意味着资源的浪费。

 

 

 

 

9、http://www.yongfa365.com/Item/ADO.NET-2.0-Connection-Pool.html

 

ADO.NET 2.0技术内幕 之 连接池

连  接  池

与微软以前的数据访问技术类似,ADO.NET包括对连接池的内置支持。

3.6.1  连接句柄和物理连接

如果正在使用Visual Studio,可以使用Visual Studio调试工具检查对象的一些内部私有属性。例如,编写一些代码来打开一个SqlConnection,并在调用Open方法的地方设置断点。右击代码中的对象,并选择【添加监视】,将该对象添加到【监视】窗口。在【监视】窗口中,展开标有Non-Pubic Members的区域。向下滚动,将会看到一个称为InnerConnection的私有属性。

从结构上讲,InnerConnection属性的内容是一个非常薄的层,位于数据库的物理连接之上。为在这里进行讨论,InnerConnection属性和到该数据库的物理连接是可交换的。在逐步执行代码时,将会看到在打开和关闭连接时,InnerConnection属性的值发生变化。当调用Open方法时,SQL Client .NET数据提供程序将SqlConnection对象关联至该数据库的物理连接,所以可以执行查询并返回结果。

打开和关闭数据库连接的代价非常高。为了帮助节省资源并提高性能,.NET Framework中的.NET数据提供程序在默认情况下均使用连接池。

3.6.2  连接池是什么

连接池是一种在打开数据存储区的连接时提高应用程序性能的机制。在调用SqlConnection对象的Close方法时,SQL Client .NET数据提供程序并不实际关闭内部连接。相反,数据提供程序将该内部连接存储到一个池中,以便在以后再次使用。甚至在SqlConnection对象被处理之后,该内部连接也保留在池中。如果在以后使用相同连接字符串和凭据调用SqlConnection对象的Open方法,将会再次使用同一内部连接与数据库进行通信。

如果希望确认是否真正再次利用了同一内部连接,可以使用.NET Reflection中的功能以可编程方式访问私有InnerConnection属性的内容。以下代码(其需要对System.Reflection命名空间的引用)在Using代码块中打开一个SqlConnection,并存储SqlConnection的InnerConnection属性的值。通过利用Using代码块,在该代码块的末尾隐式处理了SqlConnection。此代码在Using代码块中打开另一个SqlConnection,并存储SqlConnection的InnerConnection属性的值。最后,此代码对比InnerConnection属性的内容,确认它们实际上为同一对象。

Visual Basic

Dim strConn As String = "Data Source=./SQLExpress;Integrated Security=True;"

Dim propInnerConn As PropertyInfo

propInnerConn = GetType(SqlConnection).GetProperty("InnerConnection", _

                            BindingFlags.NonPublic Or BindingFlags.Instance)

Dim objInnerConn1, objInnerConn2 As Object

Using cn As New SqlConnection(strConn)

    cn.Open()

    objInnerConn1 = propInnerConn.GetValue(cn, Nothing)

    cn.Close()

End Using

Using cn As New SqlConnection(strConn)

    cn.Open()

    objInnerConn2 = propInnerConn.GetValue(cn, Nothing)

    cn.Close()

End Using

Console.WriteLine(objInnerConn1 Is objInnerConn2)

Visual C#

string strConn = @"Data Source=./SQLExpress;Integrated Security=True;";

PropertyInfo propInnerConn;

propInnerConn = typeof(SqlConnection).GetProperty("InnerConnection",

                                BindingFlags.NonPublic | BindingFlags.Instance);

object objInnerConn1, objInnerConn2;

using (SqlConnection cn = new SqlConnection(strConn))

{

    cn.Open();

    objInnerConn1 = propInnerConn.GetValue(cn, null);

    cn.Close();

}

using (SqlConnection cn = new SqlConnection(strConn))

{

    cn.Open();

    objInnerConn2 = propInnerConn.GetValue(cn, null);

    cn.Close();

}

Console.WriteLine(objInnerConn1 == objInnerConn2);

两个SqlConnection对象是在不同的Using代码块中创建的,所以其资源将在每个Using代码块的末尾被清除。InnerConnection属性的内容及其所封装的物理连接没有被处理,而是存储在池中,以便在以后被再次利用。

 注意    如果在连接字符串中禁用了连接池(稍后将解释如何禁用),将会看到此内部连接不能被重复利用。

3.6.3  连接池如何改进代码

考虑一个访问SQL Server数据库的典型ASP.NET或WebServices应用程序。客户端应用程序每次需要查询数据库时,就会在服务器端代码中进行往返,以打开SqlConnection来执行查询。在许多此类应用程序中,这一代码以相同凭据一次又一次地连接到相同数据库。理论上,这意味着客户端应用程序每次需要执行查询时,服务器端代码需要执行三个操            作——登录到数据库(需要检查所提供的凭据)、执行查询、然后注销。

连接池可以真正地提高此类应用程序的性能。通过将内部连接存储在池中,并在以后进行重复利用,就不再因为登录数据库以及从中注销而降低性能。对SqlConnection对象的Open和Close方法的调用可以短时间内返回,从而可以提高代码的性能和响应速度(请参见图3.4)。


图3.4  典型ASP.NET或WebServices应用程序中的连接池

3.6.4  启用连接池

在ADO.NET中,连接池是默认启用的。以下代码段将同一SqlConnection对象打开和关闭5次。由于连接池是默认启用的,所以当调用Close方法时,到数据库的实际连接没有被实际关闭,而是将该数据库连接发送到池中,以便在以后重复利用。

Visual Basic

Dim strConn As String

strConn = "Data Source=./SQLExpress;Integrated Security=True;"

Dim cn As New SqlConnection(strConn)

For intCounter As Integer = 1 To 5

    cn.Open()

    cn.Close()

Next intCounter

Visual C#

string strConn;

strConn = @"Data Source=./SQLExpress;Integrated Security=True;";

SqlConnection cn = new SqlConnection(strConn);

for (int intCounter = 1; intCounter <= 5; intCounter++)

{

    cn.Open();

    cn.Close();

}

3.6.5  放入池中的连接何时关闭

在调用Close方法时,SqlClient将该连接返回到池中。假定该连接没有被再次使用,将在大约5分钟后将其从池中删除。但具体在多少秒后删除,并没有确切的数值。其行为取决于所生成的随机数以及创建该池时的相对湿度(relative humidity)。当然,如果在退出应用程序时存在已打开的连接池,那么作为应用程序正常清除过程的一部分,这些连接将被关闭和处理。

3.6.6  禁用连接池

您可能不希望使用连接池。例如,如果正在使用一个直接与数据库进行通信的简单Windows应用程序,那么可能希望禁用连接池。在采用这一架构时,各个客户端应用程序需要自己的连接。在启用连接池时,每个应用程序的连接被放入池中,如果在清除连接池之前重新打开该连接,将重复利用放入池中的连接。所以,如果应用程序频繁重复使用连接,那么在启用连接池的情况下,对SqlConnection.Open的调用将会更快速地返回。但是,这种方法将会导致在任意给定时刻存在许多活动的数据库连接。禁用连接池将会降低任意时刻的活动数据库连接数目,但这样会强制所有对SqlConnection.Open的调用都建立一个新的数据库连接。

如果希望禁用连接池,可以通过向连接字符串中添加Pooling=False,逐个连接地禁用连接池。

幸运的是,在ADO.NET 2.0中不再需要记忆诸如此类的属性。如果存在疑问,可以检查SqlConnectionStringBuilder类的选项。在这个类中可以找到一个Pooling属性,其取值为Boolean类型。默认情况下,此值被设置为True。将该值设置为False将会禁止将该连接放入池中。因此,在调用SqlConnection对象的Close方法时,将会关闭与数据库的实际连接。

 注意    在“偶尔进行连接”的Windows应用程序中,使用连接池可能很有帮助,具体取决于应用程序。如果应用程序希望定期重新连接到数据库,则可以发挥连接池的作用,将与数据库的物理连接保持打开状态,至少暂时如此。如果在从池中删除该物理连接之前,应用程序尝试重新连接到该数据库,则连接池逻辑(pooling logic)将会重新使用与该数据库的物理连接。

3.6.7  有关连接池的常见问题

学习连接池的开发人员越多,出现的问题也会越多。例如,在我听到的连接池相关问题中,最常见的一个是“我怎样才能知道与数据库的物理连接是被真正关闭了,还是仅仅被放入池中了?”,另一个常见问题是“我怎样才能分辨刚刚打开的连接是建立了一个新物理连接,还是重新利用了一个被放在池中的连接?”。

有许多工具可以帮助回答有关连接池的问题。其中一些工具更出色一些。我定期使用SQL Server事件探查器来监视对SQL Server数据库的连接和查询。在ADO.NET的2.0版中,还可以使用Windows中的【性能监视器】。

ADO.NET 2.0中的SQL Client .NET数据提供程序包括用于连接池的性能计数器。现在可以使用诸如【性能监视器】等工具来查看以下数目:放入池中的连接、活动连接、自由连接、活动与非活动连接池及活动与非活动连接池组。还可以搜集有关在每秒内进行连接和断开连接数目的信息。

在某些情况下,维护性能计数器会产生一些性能影响。为此,SQL Client .NET数据提供程序没有维护以下性能计数器:活动或自由连接的数目,或者每秒内放入池中的连接数目或断开连接的数目。可以通过向应用程序的配置文件中添加一项,以启用应用程序中的这些性能计数器。如需有关使用这些性能计数器的详细信息,请参阅MSDN网站上的文章“Using ADO.NET Performance Counters”(使用ADO.NET性能计数器)。

为便于您提出有关连接池的问题,也便于我回答这些问题,我已经开发了一个示例应用程序,如图3.5所示,它可以作为本书示例代码中的一部分进行下载。这一应用程序允许使用如图3.3所示的SqlConnectionStringBuilder/PropertyGrid对话框生成连接字符串。可以很容易地生成新的SqlConnection,打开和关闭现有连接,以及调用ClearPool和ClearAllPools方法。此示例还可以通过【性能监视器】访问SQL Client性能计数器,而不需要以手动方式添加性能计数器。此应用程序的配置文件中包含一项,其能够启用在默认情况下被关闭的性能计数器。在每次创建、打开或关闭SqlConnection或关闭一个或所有连接池时,此示例中的性能计数器都会被更新。


图3.5  研究连接池

3.6.8  ADO.NET如何确定是否使用放入池中的连接

简单地说,假定连接池未被禁用,则SQL Client .NET数据提供程序在您调用SqlConnection对象的Open方法时检查ConnectionString,并确定池中是否存在可用连接。如果存在可用连接,则SQL Client使用该连接。否则,打开一个到数据库的新连接。

实际上还有一些需要说明的内容。设想一个ASP.NET应用程序,其中有多位用户以模拟(impersonation)登录同一数据库,每位用户都使用自己的凭据访问SQL Server数据库。每位用户的连接字符串都是相同的,但他们的凭据有很大不同。由于SQL Client考虑了用户权限,所以用于确定池中有哪些连接可供使用的逻辑要稍微复杂一些。

3.6.9  强制ADO.NET使用新池

在某些时候,可能不再希望从旧连接池中提取连接,而希望建立一个新池。在这种情况下,目标就是采用某种能够对池缓存(pooling)产生影响的方式来修改连接字符串,而对应用程序的剩余部分不产生影响。达到这一目标的最简单方式是在连接字符串的末尾添加一个空格。

3.6.10  手动释放池中缓存的连接

前面的技巧对于ADO.NET 1.x版非常方便,因为API的特性都不能帮助释放缓存在池中的连接。在ADO.NET 2.0中,SqlConnection类中有两个新的静态方法可提供帮助——ClearPool和ClearAllPools。

ClearPool方法取得一个SqlConnection对象,并释放缓存在一个连接池中的所有连接,此连接池与该SqlConnection对象相关。假定有10个SqlConnection对象,均使用同一连接字符串和凭据,并启用了连接池。可以调用所有10个对象的Open方法,然后调用其中三个对象的Close方法。

共有10个到SQL Server数据库的开放式连接。这些连接中的7个连接与7个打开的SqlConnection对象相关联。为了使用性能计数器所使用的术语,我们说这7个连接是“活动的”。剩下的三个连接存在于连接池中。再一次使用性能计数器的术语,它们是“自由”连接。调用ClearPool方法将释放这三个存在于连接池中的自由连接,但不会影响由7个开放式SqlConnection对象所使用的活动连接。

ClearAllPools方法没有参数,它会清除所有自由SqlConnection。

3.6.11  其他连接池选项

现在简单看一下其他常用连接池选项。每个选项都可通过SqlConnectionStringBuilder和连接字符串使用。

1. Connection Reset

如果仔细查看一个SQL事件探查器的轨迹,可能会注意到调用了一个名为sp_reset_connection的存储过程,您可能希望知道是何时调用这个存储过程的,以及为什么要调用它。

简单地重复使用缓存在池中的SqlConnection可能会产生意料之外的结果。由于缺乏更合适的术语,所以可以说:存在某个与已缓存(pooled)连接相关联的“残余”。开发人员不会总是在关闭连接时清除这些混乱,以将连接返回到其原始状态。在调用Close方法时,可能已经存在与该连接相关联的开放式游标或事务,甚至更糟。如果发出一个“USE AdventureWorks”之类的查询,该连接可能被关联到一个不同于该数据库被打开时的数据库。如果通过调用sq_setapprol为连接指定应用程序角色,这些权限仍然被应用到该连接,直到sp_unsetapprole被调用为止,或者直到sp_reset_connection被调用为止,或者直到该连接被真正关闭(而不仅仅是被放入池中)为止。

SQL Client .NET数据提供程序跟踪哪些SqlConnection使用了从连接池中提取的连接。在调用Open方法时,SqlClient没有调用sp_reset_connection存储过程,而是恰好在该连接的第一个操作之前执行这一查询。

如果能够绝对肯定没有在服务器上为池中缓存的连接留下任何“残余”,就可以向连接字符串中添加Connection Reset=False;。这一设置告诉SqlClient,当重新利用缓存在池中的连接时,不需要调用sp_reset_connection存储过程。但是,我建议不要将Connection Reset设置为False。

2. Min Pool Size

从其名称可以看出,Min Pool Size控制池中的最少连接数目。默认情况下,此属性被设置为0。

Min Pool Size属性可以帮助您准备一个连接池。假定将属性设置为5。在打开第一个连接之后,SqlClient将在一后台线程中打开另外4个连接。在该池中总是至少有5个连接。假定代码创建了10个SqlConnection对象,并将它们全部打开。和以前一样,在打开第一个SqlConnection时,SqlClient将在后台线程打开其他4个连接。接下来的4个SqlConnection对象将使用来自池中的剩余连接。剩余的5个SqlConnection对象将建立新连接。

现在,假定关闭了这10个SqlConnection对象中的8个对象。所有这8个连接都将在池中保持存活。当SqlClient清除此连接池之后(假定大约在这些SqlConnection被关闭5分钟之后,并且没有被重新使用),它将确保至少有5个连接(Min Pool Size设置)仍然存在于连接池中。此数目包括目前使用的连接,两种连接仍在使用。所以将有三个其他连接保存在连接池中。其余5个连接将被丢弃。

Min Pool Size的主要缺点是池中将至少有设定数目的连接保持活动。在ASP.NET应用程序中,这些连接的存在时间可能过长。因此,最好使Min Pool Size保持为零。

3. Max Pool Size

Max Pool Size设置的理解稍微简单一些。此设置用作一种限制特性,防止在单个池中打开的连接数目超出指定数值。Max Pool Size的默认值为100。如果达到了连接池中的最大连接数目,那么在下一次尝试打开一个连接时,经过Connect Timerout设置所指定的时间之后会引发一个InvalidOperationException,其说明“超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用,并已达到最大池         大小”。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值