ADO.net应该手动释放资源。

15 篇文章 0 订阅
13 篇文章 0 订阅

本来对于C#的GC有诸多争议,像我这样从伪C++程序员转过来的,自然对于靠第三方回收堆上对象的行为,感到一种恐惧和无力。但是,既然Java和C#都有GC,总还认为是可靠的,但是,谁知道这个可靠的GC缺出问题了。

案例:同事做的一个操作数据库的B/S小程序出问题了,前台asp.net,数据库SQL2k,操作数据库用了ADO.net,操作几次之后,页面报错,Debug时发现asp.net报错的大意为在connection时连接池超过了等待时间。

我们首先怀疑数据库连接太多,但是查询分析器直接连接数据库正常。

其次,怀疑asp.net的连接池出错,在连接字符串加了min和max之后,发现问题仍然存在。

再次,查源代码,同事说这是网上共享的源码,逻辑很简单,看了之后,第一反应就是只有connection.Open,没有Close();转念一想,C#不是有GC么,另外在博客园的博客中也有人提到使用using强制是否资源,对Linq to SQL,有时候会产生意想不到的问题,不建议。作为C#二把刀的我,类比到ADO.net 想来也应该是让GC来回收资源比较好。

结果查了半天,没有发现问题所在,只能再次加大了连接池的max,问题仍然会出现。

之后,翻阅了网上关于连接池的资料,提到

1、GC的回收是针对恶劣环境才进行的。

2、GC只回收托管资源,不回收非托管资源

3、对于连接池,在Connection.Open的时候,ado.net直接问连接池要现有连接,如果没有空闲的 ,则等待,超过等待时间,则返回time expired。

GC没有按照作用域回收资源->Connection没有关闭->连接池连接全部处于使用->新增Connection.Open请求失败,于是time expired

因此,正好手头有个项目是用ADO.net,从此发现GC也不可靠,还是手动来吧。

特此记录,可以自动释放资源的操作

1、

SqlDataReader dr= myCommand.ExecuteReader(CommandBehavior.CloseConnection)

关联的conn需要手动打开,但是SqlDataReader读完后自动关闭。


2、

SqlDataAdapter

对于关联的conn,在SqlDataAdapter.Fill()时会自动打开,完毕后会自动关闭。

一般程序对于SqlDataAdapter建议手动Dispose()原因不明。

3、

SqlConnection

用完一定要Close()或者Dispose(),差别是Close的可以Open,Dispose的不能了,因为ConnectionString=String.Empty了,见传送门


第一部分 构建ASP.NET页面 第1章 ASP.NET Framework概览 2 1.1 ASP.NET和.NET Framework 5 1.1.1 框架类库 5 1.1.2 公共语言运行库 9 1.2 ASP.NET控件 10 1.2.1 ASP.NET控件概览 11 1.2.2 HTML控件 12 1.2.3 理解和处理控件事件 12 1.2.4 视图状态 17 1.3 ASP.NET页面 20 1.3.1 动态编译 20 1.3.2 控件树 23 1.3.3 使用代码隐藏页面 24 1.3.4 处理页面事件 27 1.3.5 使用Page.IsPostBack属性 29 1.3.6 调试和跟踪ASP.NET页面 30 1.3.7 跟踪页面执行 33 1.4 安装ASP.NET Framework 35 1.5 小结 37 第2章 使用标准控件 38 2.1 显示信息 38 2.1.1 使用Label控件 38 2.1.2 使用Literal控件 42 2.2 接收用户输入 44 2.2.1 使用TextBox控件 44 2.2.2 使用CheckBox控件 50 2.2.3 使用RadioButton控件 52 2.3 提交表单数据 55 2.3.1 使用Button控件 55 2.3.2 使用LinkButton控件 57 2.3.3 使用ImageButton控件 59 2.3.4 Button控件使用客户端脚本 62 2.3.5 执行跨页面发送 64 2.3.6 指定默认按钮 67 2.3.7 处理Command事件 68 2.4 显示图像 70 2.4.1 使用Image控件 70 2.4.2 使用ImageMap控件 71 2.5 使用Panel控件 75 2.6 使用HyperLink控件 79 2.7 小结 81 第3章 使用验证控件 82 3.1 验证控件概述 82 3.1.1 验证控件与JavaScript 85 3.1.2 使用Page.IsValid 85 3.1.3 设置Display属性 86 3.1.4 突出显示验证错误 86 3.1.5 使用验证组 90 3.1.6 禁用验证 93 3.2 使用RequiredFieldValidator控件 94 3.3 使用RangeValidator控件 97 3.4 使用CompareValidator控件 99 3.5 使用RegularExpressionValidator控件 103 3.6 使用CustomValidator控件 105 3.7 使用ValidationSummary控件 111 3.8 创建自定义验证控件 114 3.8.1 创建LengthValidator控件 115 3.8.2 创建AjaxValidator控件 117 3.9 小结 121 第4章 使用Rich控件 122 4.1 接收上传文件 122 4.1.1 把文件保存到文件系统 123 4.1.2 把文件保存到数据库 125 4.1.3 上传大文件 128 4.2 显示日历 133 4.2.1 创建弹出式日期选择器 135 4.2.2 根据数据库表呈现日历 137 4.3 显示广告 141 4.3.1 在XML文件中保存广告 141 4.3.2 在数据库表中存储广告 144 4.3.3 跟踪显示和转到 145 4.4 显示不同的页面视图 149 4.4.1 显示选项卡式页面视图 149 4.4.2 显示多部分表单 152 4.5 显示向导 153 4.6 小结 157 第二部分 设计ASP.NET网站 第5章 使用母版页设计网站 160 5.1 创建母版页 160 5.1.1 创建默认内容 163 5.1.2 嵌套母版页 166 5.1.3 在母版页中使用图片和超链接 170 5.1.4 在Web配置文件中注册母版页 172 5.2 修改母版页内容 172 5.2.1 使用Title属性 173 5.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值