关于ADO.NET连接池的问题

68年的Domi 2011-01-18 11:27:29
最近在学习ADO.NET,看到说在sqlconnection上调用close()方法可以关闭连接并将连接放回连接池。当程序新建一个连接时,系统检查连接池中是否有可用连接,如果有可用连接,直接将这个连接分配给程序。连接池机制使得程序在频繁访问数据库时得到性能提升。
我的问题就在于:既然连接已经close,就算从池中取出一样需要open,那性能提升又从何谈起呢?(是否说当连接关闭后,池中的连接依然与数据库保持某种“关系”,当它再次open时就不需要新建这种“关系”?)
...全文
124 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
baysos 2011-01-18
  • 打赏
  • 举报
回复
释放内存。
bluedoctor 2011-01-18
  • 打赏
  • 举报
回复
有道理,以前居然有领导要我们自己搞一个连接池,说是根据Java的惯例,这样做可以提高效率。我们的领导是从Java转过来做.NET开发管理的。
旅行者I号 2011-01-18
  • 打赏
  • 举报
回复
这么理解,DB与连接池的关系是资源占用释放的关系,连接池与应程是连接开闭的关系。连接的关闭只是个状态改变而已,并没有造成资源的释放,连接池会根据生命时间等处理池中连接的资源释放。
rabbitlzx 2011-01-18
  • 打赏
  • 举报
回复
如果你英文不好就看我的翻译:
对ado.net来说连接池默认是enabled的,当在一个连接对象上调用Open方法时,会到池中查找是否有可以直接拿过来就用的连接,如果没有才会真正的打开一个新的连接。当在连接对象上调用Close方法时,只是将连接对象放入池中,而不是真正的将连接关闭
68年的Domi 2011-01-18
  • 打赏
  • 举报
回复
我中午用SP_WHO2测试发现,一个连接只要open了,再执行close,与数据库的连接并没有断开。

static void Main(string[] args)
{
SqlConnection conn=new SqlConnection(@"Data Source=XXX\YYY;Initial Catalog=ConnectionDEMO;Integrated Security=True");
conn.Open();

SqlConnection conn1 = new SqlConnection(@"Data Source=XXX\YYY;Initial Catalog=ConnectionDEMO;Integrated Security=True");
conn1.Open();

SqlConnection conn2 = new SqlConnection(@"Data Source=XXX\YYY;Initial Catalog=ConnectionDEMO;Integrated Security=True");
conn2.Open();

SqlConnection conn3 = new SqlConnection(@"Data Source=XXX\YYY;Initial Catalog=ConnectionDEMO;Integrated Security=True");
conn3.Open();

//conn3.Close();conn2.Close();conn1.Close();conn.Close();无论有没有这行代码,程序依然与数据库保持3个连接

Console.ReadKey();


实践出真知啊...
rabbitlzx 2011-01-18
  • 打赏
  • 举报
回复
Whenever a user calls Open on a connection, the pooler looks to see if there is an available connection in the pool. If a pooled connection is available, it returns it to the caller instead of opening a new connection. When the application calls Close on the connection, the pooler returns it to the pooled set of active connections instead of actually closing it. Once the connection is returned to the pool, it is ready to be reused on the next Open call.
rabbitlzx 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 znfsky 的回复:]
最近在学习ADO.NET,看到说在sqlconnection上调用close()方法可以关闭连接并将连接放回连接池。当程序新建一个连接时,系统检查连接池中是否有可用连接,如果有可用连接,直接将这个连接分配给程序。连接池机制使得程序在频繁访问数据库时得到性能提升。
我的问题就在于:既然连接已经close,就算从池中取出一样需要open,那性能提升又从何谈起呢?(是否说当连接关闭后,池中的连接依然与……
[/Quote]
sqlconnection.open会首先检查连接池中是否有可用的连接,如果有,拿出来就用,如果没有再进行连接

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧