sqlcon.Close 本来就不保证关闭与SQL Server的物理连接。谁对你说过 SqlConnection.Close 是关闭进程打开的数据库会话的呢?SqlConnection 自己维护连接池,它会在必要时才关闭多余的会话。假设你的程序在2分钟总共内创建1万个SqlConnection,那么可能真正只有15个“与 SQL Server的会话连接”就能应付这1万个 sqlcon.Open --> sqlcon.Close了,这是连接池自己去管理的,用不着你去操心打开和关闭数据库会话连接问题,你只要在你的程序中尽快地执行 sqlcon.Close 从而能够让连接池更早地得到可复用的连接信息就行了。

解决方案 »

  1.   

    .net会维护一个连接池,这样你再创建时,会根据你的连接信息,从池中查找,如果找到就不会直接用,减少开支
      

  2.   


    SqlDataReader 有个CommandBehavior.CloseConnection可以实现此功能,但不能直接使用,可否根据方法有解决方案?
      

  3.   

    数据库连接资源很宝贵,反复的打开和关闭,会造成数据库效率低下。为了确保应用程序的稳定和降低性能成本,ado.net使用了连接池的优化方法来管理维护数据库连接
    连接池可以减少创建连接的次数
    SqlConnection.Open的时候,连接池会检查池子中是否有可用的连接,如果有,立即返回给调用者,否则创建新的连接。SqlConnection.Close,连接池会判断池子里连接数是否在最大连接数之内,如果是,会将连接收回池子而并不是真正的关闭,否则才会销毁连接。回到池子里的连接,在下一次Open的时候可以重复使用。连接池默认最大连接数是100,你可以做个试验:
    在连接字符串设定最多连接数MaxPoolSize=2
    然后创建连接,进行关闭,当连接超过2个之后的连接,你执行Close,然后去sp_who查看,应该是销毁掉的。或者你调用SqlConnection.ClearPool(SqlConnection connection),应该也会把连接销毁。