.Net 数据源连接池

此示例阐释如何建立到数据源的连接池。需要进行此操作来部署高性能的应用程序。在
此示例中,池是在连接字符串中建立起来,并由 SqlConnection 自动管理的。
在此示例中,在构造 SqlConnection 时在连接字符串中指定池特性,如以下的代码示
例中所示。请注意:池处理是隐式的,除非将其禁用,否则将自动进行池处理。因此,
"true"是默认的池关键词 (pooling=true)。
String connString;
connString =
"server=(local)//VSdotNET;Trusted_Connection=yes;database=northwind;" + "connection reset=false;" + "connection lifetime=5;" + "min pool size=1;" + "max pool size=50";

SqlConnection myConnection1 = new SqlConnection(connString); SqlConnection myConnection2 = new SqlConnection(connString); SqlConnection myConnection3 = new SqlConnection(connString);
现在,我们有了使用池中的若干连接的代码。首先,打开两个连接并返回这两个到池的
连接。然后,从池中打开三个连接,并返回所有这三个到池的连接。

// Open two connections. One is from the pool (see min pool size), the other is created.
Console.WriteLine ("Open two connections."); myConnection1.Open(); myConnection2.Open();

// Now there are two connections in the pool that matches the connection string.
// Return the both connections to the pool.
Console.WriteLine ("Return both of the connections to the pool."); myConnection1.Close(); myConnection2.Close();

// Get a connection out of the pool.
Console.WriteLine ("Open a connection from the pool."); myConnection1.Open();

// Get a second connection out of the pool.
Console.WriteLine ("Open a second connection from the pool."); myConnection2.Open();

// Open a third connection.
Console.WriteLine ("Open a third connection.");

当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与连接中
的字符串相关联。每个连接池都与一个不同的连接字符串相关联。当新连接打开时,如
果连接字符串不精确匹配现有池,则将创建一个新池。

在以下示例中,将创建三个新的 SqlConnection 对象,但只需要使用两个连接池来管
理这些对象。请注意,第一个和第二个连接字符串的差异在于为 Initial Catalog 分
配的值。

SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind"; conn.Open(); // Pool A is created.

SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs"; conn.Open(); // Pool B is created because the connection strings differ.

SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind"; conn.Open(); // The connection string matches pool A.
连接池一旦创建,直到活动进程终止时才会被毁坏。非活动或空池的维护只需要最少的
系统开销。

连接的添加
连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将
其添加到该池中,以满足最小池大小的要求。连接将根据需要添加到池中,直至达到最
大池大小。

当请求 SqlConnection 对象时,如果存在可用的连接,则将从池中获取该对象。若要
成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上
下文相关联,并且具有与服务器的有效链接。

如果已达到最大池大小且不存在可用的连接,则该请求将会排队。当连接被释放回池中
时,对象池管理程序将重新分配连接,以满足这些请求。如果在可获取连接对象之前超
时期限已过(由 Connect Timeout 连接字符串属性来决定),则将出错。

警告 每次使用完 Connection 后都必须将其关闭。这可以使用 Connection 对象的
Close 或 Dispose 方法来实现。未显式关闭的连接将不会添加或返回到池中。
连接的移除
如果连接生存期已过或者池管理程序检测到与服务器的连接已被断开,则对象池管理程
序将从池中移除该连接。请注意,只有在尝试与服务器进行通讯后,才可以检测到这种
情况。如果发现某连接不再连接到服务器,则会将其标记为无效。对象池管理程序会定
期扫描连接池,以查找已被释放到池中并标记为无效的对象。找到后,这些连接将被永
久移除。

如果与已消失的服务器的连接还存在,那么即使对象池管理程序未检测到断开的连接并
将其标记为无效,仍有可能将此连接从池中取出。当发生这种情况时,将生成异常。但
是,为了将该连接释放回池中,仍必须将其关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值