WinForm程序,登录环节
登录时创建一SQL连接,业务正常使用,此时,假如将此连接关闭并释放掉,在SQL中查看,还是可以看到此连接信息,怎么样彻底关闭此连接?
例:
创建连接 sqlcon
正常使用
使用结束(只需要将连接关闭,不需要退出应用程序)
sqlcon.Close();
sqlcon.Dispose();
GC.Collect();
在程序中可以发现sqlcon.State为Closed状态,但sqlcon还在(即new SqlConnection()的对象还在),SQL SERVER中也可以看到此连接的用户并未销毁(用sp_who2还可以看到此用户进程)),怎么样将这个进程销毁
但假如退出应用程序,SQL 中的进程也会销毁
怎么样在不退出应用的情况下将创建的连接关闭掉并同时销毁创建的连接对象和SQL进程?
登录时创建一SQL连接,业务正常使用,此时,假如将此连接关闭并释放掉,在SQL中查看,还是可以看到此连接信息,怎么样彻底关闭此连接?
例:
创建连接 sqlcon
正常使用
使用结束(只需要将连接关闭,不需要退出应用程序)
sqlcon.Close();
sqlcon.Dispose();
GC.Collect();
在程序中可以发现sqlcon.State为Closed状态,但sqlcon还在(即new SqlConnection()的对象还在),SQL SERVER中也可以看到此连接的用户并未销毁(用sp_who2还可以看到此用户进程)),怎么样将这个进程销毁
但假如退出应用程序,SQL 中的进程也会销毁
怎么样在不退出应用的情况下将创建的连接关闭掉并同时销毁创建的连接对象和SQL进程?
解决方案
10
.net会维护一个连接池,这样你再创建时,会根据你的连接信息,从池中查找,假如找到就不会直接用,减少开支
60
数据库连接资源很宝贵,反复的打开和关闭,会造成数据库效率低下。为了确保应用程序的稳定和降低性能成本,ado.net使用了连接池的优化方法来管理维护数据库连接。
连接池可以减少创建连接的次数
SqlConnection.Open的时候,连接池会检查池子中能否有可用的连接,假如有,立即返回给调用者,否则创建新的连接。SqlConnection.Close,连接池会判断池子里连接数能否在最大连接数之内,假如是,会将连接收回池子而并不是真正的关闭,否则才会销毁连接。回到池子里的连接,在下一次Open的时候可以重复使用。
连接池默认最大连接数是100,你可以做个试验:
在连接字符串设定最多连接数MaxPoolSize=2
然后创建连接,进行关闭,当连接超过2个之后的连接,你执行Close,然后去sp_who查看,应该是销毁掉的。
或你调用SqlConnection.ClearPool(SqlConnection connection),应该也会把连接销毁。
连接池可以减少创建连接的次数
SqlConnection.Open的时候,连接池会检查池子中能否有可用的连接,假如有,立即返回给调用者,否则创建新的连接。SqlConnection.Close,连接池会判断池子里连接数能否在最大连接数之内,假如是,会将连接收回池子而并不是真正的关闭,否则才会销毁连接。回到池子里的连接,在下一次Open的时候可以重复使用。
连接池默认最大连接数是100,你可以做个试验:
在连接字符串设定最多连接数MaxPoolSize=2
然后创建连接,进行关闭,当连接超过2个之后的连接,你执行Close,然后去sp_who查看,应该是销毁掉的。
或你调用SqlConnection.ClearPool(SqlConnection connection),应该也会把连接销毁。
10
试试看Using行不行