我们有一个使用单个连接字符串连接到数据库的Web服务器,这使其成为能够使用连接池的强大候选者。
我们需要一个SqlConnection对象,还是很多?
即我们应该在共享内存中设置一个连接,并且每次都使用它,还是每次我们想要使用任何连接对象时都应该创建一个新连接?
是否调用.Open()从池中分配它,或者创建具有相同连接字符串的新对象?
另外,我们是否需要在连接释放回池之前调用连接上的.Close(),或者变量是否超出范围?
我在某个地方读到了(我忘了确切地说 - 抱歉)你不应该在游泳池中的连接上调用close,因为它会以某种方式将它们从池中删除。
答案 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
}