65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 中的连接池

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.58/5 (9投票s)

2009 年 12 月 6 日

CPOL

3分钟阅读

viewsIcon

101062

downloadIcon

2500

数据库应用程序的高效性能使用数据库

引言

现在,越来越多的人使用互联网。人们使用网站了解来自各个服务部门(如铁路、电信、航空旅行、旅游、快递、货运等)的所有详细信息...天啊,我无法说它会一直持续下去。因此,如果我们为某些服务创建一个网站,我们肯定希望拥有更多的客户。因此,如果有更多客户登录到数据库,由于打开了更多多个连接,Web服务器的性能会变慢。为了避免这个问题,我们必须在我们的网站或Windows应用程序的连接字符串中使用名为“连接池”的最佳功能。

ConnectionString

我想您了解连接字符串,但我仍然会告诉您它是什么。它有点像将应用程序连接到数据库(无论数据库位于何处)的地址。它看起来像

SqlConnection Objsqlcon=new SqlConnection("intialcatalog=db_test;DataSource=DBSERVER ;")

连接池

连接池是一个非常简单的实现方法,但是当更多用户登录时,它会对性能产生巨大的影响。默认情况下,连接字符串启用连接池。

默认情况下,最大池数为 100,最小池数为 0。

连接池的工作原理

让我们看看它是如何工作的?

我们说过默认情况下我们有 100 个池。当第一个用户进入我们的网页并尝试打开一个连接时,会创建第一个连接池。现在还剩下 99 个池。同时,如果一个用户尝试使用相同的字符串打开连接,那么我们的池管理器会检查是否有任何使用相同连接字符串的已打开池是空闲或可用的。如果第一个用户关闭连接,则该池将变为可用,并且此用户开始使用同一池。因此,第二个用户也使用相同的池,我们可以获得更高的性能和资源。假设池没有被释放,并且第一个用户仍在使用它,那么池管理器将从剩余的 99 个池中创建一个新池并使用它。就像这样,当 n 个用户尝试建立连接时,如果池可用,它将重用同一个池,或者如果 100 个池都被占用,它将等待一个池被释放。如果池在特定时间内被释放,它将使用它,否则等待连接将过期。因此,对于大型客户网站,100 个池是不够的。因此,我们必须允许更多的池。

记住:

如果连接字符串不同,它将创建一个新池。

Using the Code

在下面我们可以看到创建的连接字符串,这里我使用一个单独的类来建立连接和打开连接。如果我们的网站很大,我们不想在每个地方都编写连接字符串。只需在一个类中创建一个连接即可。

这里的类名是

public class ContextFactoryDAO

我们正在同一类的构造函数中建立连接字符串。因此,到我们为该类创建对象时,连接字符串已准备就绪。我们正在使用字符串生成器来创建连接字符串,因此如果发生任何更改,我们可以稍后非常容易地进行更改。

SqlConnectionStringBuilder Obj_sqnbuild = new SqlConnectionStringBuilder(); 

在下面的代码中,你可以看到我给出的池详细信息

public class ContextFactoryDAO
{
        //For switching between access and MSSQL two channel is instantiated
        SqlConnection Obj_sqlcon = 
		new SqlConnection();//making the instance of sqlconnection
        OleDbConnection Obj_olecon = 
		new OleDbConnection();//making the instance of oledbconnection
        SqlConnectionStringBuilder Obj_sqnbuild = 
		new SqlConnectionStringBuilder();//making the instance for the 
						//sqlConnection String builder
        OleDbConnectionStringBuilder  Obj_odnbuild = 
		new OleDbConnectionStringBuilder();//making the instance for 
					//oledbconnection string builder
       
        public  ContextFactoryDAO()//Connection in constructor so as to
					//instantiate at an early stage
        {
            ///* connection string building for sql and oledb from 1st line to 5th line*/
             SqlConnectionStringBuilder Obj_sqnbuild = 
		new SqlConnectionStringBuilder();//making the instance for 
					//the sqlConnection String builder
             Obj_sqnbuild.InitialCatalog = "dB_test";
             Obj_sqnbuild.DataSource = "DBSERVER";
             Obj_sqnbuild.UserID = "sa";
             Obj_sqnbuild.Password = "db_Ser3er_2009";
             Obj_sqnbuild .Add ("Max pool size",1500);
             Obj_sqnbuild .Add ("Min pool size",20);
             Obj_sqnbuild.Add("Pooling", true);
             Obj_sqlcon.ConnectionString = Obj_sqnbuild.ConnectionString;      
        }
     
        public void opensqlcon(SqlConnection connect)//function for opening 
	//the SQL channel which will close the function if it is opened already
        {
            if (connect.State == ConnectionState.Open)
            {
                connect.Close();
            }            
                connect.Open();
        }
       
        public string sConNme//Property for retrieving the sql connection string
        {
            get
            {
                return Obj_sqlcon.ConnectionString;
                //return Obj_odnbuild.ConnectionString;
            }
            set
            {
                sConNme = value;
            }
        }       
    }
}

现在,在这段代码的最后一行,我已将连接字符串从 `string builder` 分配给 `sqlconnection` 对象。

现在我有一个用于打开连接的方法和一个用于获取连接字符串的属性。

在我们的表示层中,如果必须打开连接,我将创建此类的对象并访问 `opensqlcon( connectionstring)`。

该属性正在访问连接字符串。

我请求您下载示例源代码并尝试演示。

历史

  • 2009 年 12 月 5 日:首次发布
© . All rights reserved.