.NET程序中对连接池的管理方法‖数量的连接放入连接池中提
连接池的管理。
每次创建一个连接都会消耗一定
供给用户使用,用户使用完后把
| 的资源,我们可以事先创建好一定
连接返回连接池,这里我就来说说
|
1。连接池允许应用程
接请求重新建立一个连接。
复使用这个连接而不必实施
| 序从连接池中获得一个连接并使
一旦一个新的连接被创建并且放
整个数据库连接创建过程。
| 用这个连接,而不需要为每一个连
置在连接池中,应用程序就可以重
|
2。当应用程序请求一
连接;当应用程序使用完连
| 个连接时,连接池为该应用程序
接后,该连接被归还给连接池而
| 分配一个连接而不是重新建立一个
不是直接释放。
|
2。创建一个新的数据库连接所耗费
服务器的(网络)距离,而且这个过程通
据库连接请求可以直接通过连接池满足而
样就节省了时间。
| 的时间主要取决于网络的速度以及应用程序和数据库
常是一个很耗时的过程。而采用数据库连接池后,数
不需要为该请求重新连接、认证到数据库服务器,这
|
1。数据库连接池中可能存在着多个
的浪费)。
| 没有被使用的连接一直连接着数据库(这意味着资源
|
| ps:这必须要求开发人员在开发时估计这个系统最大提供的数量是多少。 |
当连接打开时,将根据
字符串相关联。每个连接池
符串不精确匹配现有池,则
| 一种精确的匹配算法来创建连接
都与一个不同的连接字符串相关
将创建一个新池。
| 池,该算法会使连接池与连接中的
联。当新连接打开时,如果连接字
|
在以下示例中,将创建三个新的 Sql
这些对象。请注意,第一个和第二个连接
| Connection 对象,但只需要使用两个连接池来管理
字符串的差异在于为 Initial Catalog 分配的值。
|
SqlConnection conn =
| new SqlConnection();
|
conn.ConnectionStrin
| g = "Integrated Security=SSP
| I;Initial Catalog=northwind";
|
SqlConnection conn =
| new SqlConnection();
|
conn.ConnectionString = "Integra
| ted Security=SSPI;Initial Catalog=pubs";
|
| // 连接池B创建了,因为ConnectionString与A不匹配 |
SqlConnection conn = new SqlConn
| ection();
|
conn.ConnectionStrin
| g = "Integrated Security=SSP
| I;Initial Catalog=northwind";
|
| // 使用A的连接池,因为ConnectionString与A匹配 |
连接池一旦创建,直到
统开销。
| 活动进程终止时才会被毁坏。非
| 活动或空池的维护只需要最少的系
|
连接池是为每个唯一的连接字符串创
添加到该池中,以满足最小池大小的要求
。
| 建的。当创建一个池后,将创建多个连接对象并将其
。连接将根据需要添加到池中,直至达到最大池大小
|
当请求 SqlConnection
为可用连接,该连接当前必
联,并且具有与服务器的有
| 对象时,如果存在可用的连接
须未被使用,具有匹配的事务上
效链接。
| ,则将从池中获取该对象。若要成
下文或者不与任何事务上下文相关
|
如果已达到最大池大小
,连接池管理程序通过重新
Dispose 时,连接被释放回
| 且不存在可用的连接,则该请求
分配连接来满足这些请求。对 C
池中。
| 将会排队。当连接被释放回池中时
onnection 调用 Close 或
|
警告 建议使用完 Connection 后
用 Connection 对象的 Close 或 Dispos
返回到池中。例如,如果连接已超出范围
然有效时,该连接才会返回到连接池中。
| 始终将其关闭,以便连接可以返回到池中。这可以使
e 方法来实现。不是显式关闭的连接可能不会添加或
但没有显式关闭,则仅当达到最大池大小而该连接仍
|
注意 不要在类的 Fi
调用 Close 或 Dispose。
非托管资源,则不要在类定
| nalize 方法中对 Connection、
在终结器中,仅释放类直接拥有
义中包含 Finalize 方法。有关
| DataReader 或任何其他托管对象
的非托管资源。如果类不拥有任何
更多信息,请参见厥毡喑獭?br> |
如果连接生存期已过期,或者连接池
程序将从池中移除该连接。请注意,只有
。如果发现某连接不再连接到服务器,则
池,查找已释放到池中并标记为无效的对
| 管理程序检测到与服务器的连接已断开,连接池管理
在尝试与服务器进行通信后,才可以检测到这种情况
会将其标记为无效。连接池管理程序会定期扫描连接
象。找到后,这些连接将被永久移除。
|
如果存在与已消失的服
其标记为无效,仍有可能将
将该连接释放回池中,仍必
| 务器的连接,那么即使连接池管
此连接从池中取出。当发生这种
须将其关闭。
| 理程序未检测到已断开的连接并将
情鍪保梢斐!5牵?br>
|
Connection Lifetime
如果时间间隔超过由 Conne
聚集配置中可以使用它来强
| 0 当连接返回到池中时,将对它
ction Lifetime 指定的值(以
制在运行服务器和刚联机的服务
| 的创建时间和当前时间进行比较,
秒为单位),则会毁坏该连接。在
器之间达到负载平衡。
|
| 如果值为零 (0),则将使池连接具有最大的超时期限。 |
Connection Reset 'true' 确定在从
Microsoft SQL Server 版本 7.0,如果
往返过程,但必须注意的是连接状态(如
| 池中移除数据库连接时是否将其重置。对于
设置为 false,将避免在获取连接时经历一个额外的
数据库上下文)不会被重置。
|
Enlist 'true' 当为 t
前事务上下文中登记连接。
| rue 时,如果存在事务上下文,
| 池管理程序将自动在创建线程的当
|
| Max Pool Size 100 池中允许的最大连接数。 |
| Min Pool Size 0 池中维护的最小连接数。 |
Pooling 'true' 当为 true 时,将
其添加到相应的池中。
| 从相应的池中取出连接,或者在必要时创建连接并将
|
| namespace HowTo.Samples.ADONET |
| using System.Data.SqlClient; |
| public class connectionpooling |
| public static void Main() |
connectionpooling myconnectionpo
| oling = new connectionpooling();
|
| myconnectionpooling.Run(); |
// Specification in
| the connection string:
|
// Please note: Pool
disable it.
| ing is implicit, you automat
| ically get it unless you
|
// Therefore, "true
(pooling=true).
| " is the default for the pooling keyword
|
| // Connection Reset: False |
| // Connection Lifetime: 5 |
connString = "server=(local)\Ne
yes;database=northwind;" +
| tSDK;Trusted_Connection=
|
| "connection reset=false;" + |
| "connection lifetime=5;" + |
SqlConnection myConn
| ection1 = new SqlConnection(
| connString);
|
SqlConnection myConn
| ection2 = new SqlConnection(
| connString);
|
SqlConnection myConn
| ection3 = new SqlConnection(
| connString);
|
| Console.WriteLine ("打开两个连接。"); |
// Now there are two
string.
| connections in the pool tha
| t matches the connection
|
// Return the both c
| onnections to the pool.
|
| Console.WriteLine ("将两个连接都返回到池中。"); |
| // Get a connection out of the pool. |
| Console.WriteLine ("从池中打开一个连接。"); |
// Get a second connection out o
| f the pool.
|
| Console.WriteLine ("从池中打开第二个连接。"); |
| // Open a third connection. |
| Console.WriteLine ("打开第三个连接。"); |
// Return the all co
| nnections to the pool.
|
| Console.WriteLine ("将所有三个连接都返回到池中。"); |
| Console.WriteLine(e.ToString()); |
上一页> 下一页>