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

时间:2010-07-13 12:14:32

标签: sql connection-pooling

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

 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)
    ...
    }

2 个答案:

答案 0 :(得分:1)

当您不再需要连接时,应始终处置连接。处置它们不会关闭连接池中的底层连接,而是将其释放回池中。否则,在垃圾收集器到处清理孤立的SqlConnection对象之前,连接将保持不可用。

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

using (SqlConnection con = new SqlConnection(someConnectionString)
{
...
}

由于底层连接保持打开状态,因此经常处置SqlConnection对象不会受到惩罚。下次创建SqlConnection时,它将选择池中可用的一个连接。

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

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

一旦开始使用连接池,您的应用程序真正需要的连接很少,您可能会感到惊讶。

答案 1 :(得分:1)

SQL客户端,是否; ODBC,JDBC,ADO.Net等将根据用于启动连接的连接字符串来控制池。连接字符串具有许多参数,用于控制如何管理这些连接,包括池化。虽然.Net具体,但这里讨论的概念适用于数据库和编程语言:Connection Pooling for the .NET Framework Data Provider for SQL Server