ConnectionPools有一个连接,还是很多?

时间:2013-10-17 12:08:18

标签: c# sql-server

我们有一个使用单个连接字符串连接到数据库的Web服务器,这使其成为能够使用连接池的强大候选者。

我们需要一个SqlConnection对象,还是很多?

我们应该在共享内存中设置一个连接,并且每次都使用它,还是每次我们想要使用任何连接对象时都应该创建一个新连接?

是否调用.Open()从池中分配它,或者创建具有相同连接字符串的新对象?

另外,我们是否需要在连接释放回池之前调用连接上的.Close(),或者变量是否超出范围?

我在某个地方读到了(我忘了确切地说 - 抱歉)你不应该在游泳池中的连接上调用close,因为它会以某种方式将它们从池中删除。

2 个答案:

答案 0 :(得分:4)

值得注意的是,相同的连接字符串将重新使用已返回池的连接,但以任何方式更改它将导致与服务器建立新连接。

即。 假设SQLBox具有IP 10.0.0.1

using (var conn = new SqlConnection(@"Server=10.0.0.1;...") {
                conn.Open();
                .. Do work ..
                conn.Close();
}
using (var conn = new SqlConnection(@"Server=SQLBox;…") {
                conn.Open(); // This will *NOT* reuse the connection from the pool.
                .. Do work ..
                conn.Close();
}
using (var conn = new SqlConnection(@"Server=10.0.0.1;...") {
                conn.Open(); // This *WILL* reuse the connection from the pool.
                .. Do work ..
                conn.Close();
}

答案 1 :(得分:1)

每次需要访问数据库时都应该打开一个单独的连接,并在完成所有访问后关闭它。不要让你的连接打开太久。没有必要,现代数据库肯定非常擅长处理多个连接。

您可以将连接池的管理留给SQL Server - 只要您不试图阻止它,它就会做得很好。

最好使用本地连接对象,而不是跨代码的多个部分共享它。您可以使用using模式确保您的连接已关闭:

using (SqlConnection conn = new SqlConnection("connectionstring"))
{
    conn.Open();
    // use your connection here
}
相关问题