Sql 使用连接池,正确的方法是什么?

Sql 使用连接池,正确的方法是什么?,sql,connection-pooling,Sql,Connection Pooling,我今天看到了这个问题,但我不确定我是否理解得很好。使用相同的连接字符串也会导致他们“共享”连接(如果有),对吗?所以,使用这样的类可以吗?将它作为引用传递给多线程应用程序中的每个客户端,然后只调用它的方法。无论如何,如果第一个连接上,会不会有短暂的延迟 public int(string commandText) { SqlConnection con=new SqlConnection(SOME CONSTRING with pooling ON) ...

我今天看到了这个问题,但我不确定我是否理解得很好。使用相同的连接字符串也会导致他们“共享”连接(如果有),对吗?所以,使用这样的类可以吗?将它作为引用传递给多线程应用程序中的每个客户端,然后只调用它的方法。无论如何,如果第一个连接上,会不会有短暂的延迟

 public int(string commandText)
    {
      SqlConnection con=new SqlConnection(SOME CONSTRING with pooling ON)
    ...

    }

    public string(string commandText)
    {
      SqlConnection con=new SqlConnection(the same CONSTRING with pooling ON)
    ...
    }

当您不再需要连接时,应始终丢弃这些连接。处理它们不会关闭连接池中的基础连接,而是将其释放回连接池。否则,连接将保持不可用,直到垃圾收集器开始清理孤立的SqlConnection对象

为了最大限度地利用连接池,您应该始终在using语句中包含您的连接:

using (SqlConnection con = new SqlConnection(someConnectionString)
{
...
}
由于基础连接保持打开状态,因此频繁处理SqlConnection对象不会带来任何损失。下次创建SqlConnection时,它将选择池中可用的连接之一

在多线程应用程序中传递连接是个坏主意,因为多个线程会试图同时使用它,结果不可预测。首先,SqlConnection实例方法不是线程安全的。更糟糕的是,事务是特定于连接的,最终可能会导致一个线程扰乱另一个线程的事务。在每个线程中打开一个新连接更容易、更安全

就开销而言,在打开一个新连接时,您总是会有开销,即使使用连接池也是如此。当有一个未使用的打开连接可用时,池可以为您节省创建新连接的开销。如果确保尽快释放连接,则不必创建太多连接


一旦您开始使用连接池,您可能会惊讶于应用程序真正需要的连接是多么少;ODBC、JDBC、ADO.Net等将根据用于启动连接的连接字符串控制池。连接字符串具有许多参数,这些参数控制如何管理这些连接,包括池。尽管.Net特定,但此处讨论的概念适用于数据库和编程语言:

谢谢您的回答。但是,我没有传递连接对象,只传递了对每个方法创建SQLConnection的类的引用。此外,调用任何方法的每个线程都将创建自己的连接对象。在这种情况下,连接是在一个类内创建还是在另一个类内创建并不重要。