连接池是一个连接,还是多个连接

本文关键字:连接 一个 | 更新日期: 2023-09-27 18:35:42

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

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

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

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

另外,我们需要打电话.在连接释放回池之前对连接进行 Close(),还是变量超出了范围?

我在某处读到(我忘记了确切的位置 - 对不起),您不应该在池中的连接上调用 close,因为它以某种方式将它们从池中删除。

连接池是一个连接,还是多个连接

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

即假设 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();
}

每次需要访问数据库时,都应打开一个单独的连接,并在完成所有访问后将其关闭。不要让连接保持打开状态太久。这不是必需的,现代数据库绝对非常擅长处理多个连接。

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

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

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