2010-07-13 105 views
3

今天看到了这个问题,但我不确定我是否理解。也使用相同的连接字符串导致他们将“共享”连接(如果免费),对不对?所以,可以将类作为参考传递给多线程应用程序中的每个客户端,并调用其方法。无论如何,在第一个连接起来的情况下,不会有短暂的滞后吗?使用连接池,什么是正确的方法?

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

回答

1

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

为了利用连接池最大,你应该始终在using语句的连接:

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

有没有从作为底层连接保持打开频繁的配置对象的SqlConnection处罚。下次创建SqlConnection时,它将选择池中可用的连接之一。

在多线程应用程序中传递连接是个坏主意,因为多个线程会尝试同时使用它,并产生不可预知的结果。首先,SqlConnection实例方法不是线程安全的。更糟糕的是,事务是特定于连接的,你最终可能会遇到一个线程搞乱了另一个事务。在每个线程中打开一个新的连接非常简单和安全。

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

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

+0

谢谢你的回答。但是,我没有传递连接对象,只引用了每个方法创建SQLConnection的类。另外每个调用任何方法的线程都会创建自己的连接对象。 – Snake 2010-07-13 12:44:36

+0

在这种情况下,连接是在一个类中还是另一个类中创建并不重要。 – 2010-07-13 13:17:36

相关问题