请问这样能否正确释放资源?

sjt 2009-12-05 07:05:26
我在项目中使用的数据库连接是这样的
首先是一个传递数据连接对象的方法
public static DataContext GetDataContext()
{
var db = new DataContext(ConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString);
return db;
}

需要连接的地方就
using(var db= DatabaseHelper.GetDataContext())
{
///相关操作代码
}

这样最后数据库连接能否正确释放掉?会不会占用过多连接池?
它释放的是GetDataContext内的db对象,还是仅仅释放了using 中的db对象?
谢谢
...全文
67 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjt 2009-12-05
  • 打赏
  • 举报
回复
似乎是被释放掉了,Using外声明的对象,在Using中引用也会被释放掉,汗,看看我的测试代码

private SqlConnection conn;
protected void Page_Load(object sender, EventArgs e)
{
string sql = "SELECT * FROM ETComment_Content";
using (SqlConnection db = GetConn())
{
using (SqlDataAdapter DataAdapter = new SqlDataAdapter(sql,db))
{
using (DataTable table1 = new DataTable())
{
DataAdapter.Fill(table1);
}
}
}
using (SqlDataAdapter DataAdapter = new SqlDataAdapter(sql, conn))
{
using (DataTable table1 = new DataTable())
{
DataAdapter.Fill(table1);
}
}
}

private SqlConnection GetConn()
{
return conn = new SqlConnection(ConfigHelper.GetConfig().SystemInfos.ConnStr);
}

我声明了一个conn的连接对象,第一次的时候在using中用GetConn取得连接对象,第二次直接访问conn,结果抛出一个 System.InvalidOperationException: ConnectionString 属性尚未初始化。的错误,看来这么做也没有问题,我以前一直这么做,但国内很多开源程序都是到了到了使用在声明对象

using (IDbConnection connection = Factory.CreateConnection())
{
connection.ConnectionString = ConnectionString;
connection.Open();

return ExecuteNonQuery(out id, connection, commandType, commandText, commandParameters);
}

比如这样,汗,搞得我也不确定了
sjt 2009-12-05
  • 打赏
  • 举报
回复
但这样说的话using应该释放的是 var db=DatabaseHelper.GetDataContext()
这个db所占用的资源,而不是GetDataContext()内容部的db对象
还是说返回的对象干脆就是个地址引用,这边释放了,那边也就释放了,汗,实在有点糊涂。
xuan.ye 2009-12-05
  • 打赏
  • 举报
回复
没有
我记得gc的释放资源是一秒钟几千次,也可能是1秒一次,也可能是几秒一次。

除非是unsafe代码,才能显示的及时释放

以上纯平经验,不对的就看高手了
mzjmicrosoft 2009-12-05
  • 打赏
  • 举报
回复
正如梦大哥所言

采用using(你的数据库链接)最大的好处就是你无需在编写finally区块代码

程序会自动调用Dispose()方法释放SqlConnection对象所占用的系统资源
sjt 2009-12-05
  • 打赏
  • 举报
回复
瀑布汗
public static DataContext GetDataContext()
{
var db = new DataContext(ConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString);
return db;
}

那这里面的这个db到底被释放没有?
GC释放资源并不可靠,我想问的是从Using中出来以后GetDataContext的db这个连接到底有没有立即释放
谢谢大家。
CPPACE 2009-12-05
  • 打赏
  • 举报
回复
高深科技
wuyq11 2009-12-05
  • 打赏
  • 举报
回复
托管资源由 .NET Framework 垃圾回收器 (GC) 释放
Using 块的工作方式类似于 Try...Finally 构造,在该构造中,Try 块使用资源,而 Finally 块释放资源。因此,不管您如何退出块,Using块都可确保资源的释放。
Using 语句获取的每个资源变量的范围仅限于 Using 块。
using语句提供了强制清理对象资源的便捷操作方式,允许指定何时释放对象的资源源。
所有拥有非托管资源的类型都会实现Idisposable接口
红街咖啡 2009-12-05
  • 打赏
  • 举报
回复

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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