Ado.net间歇性出现莫名其妙问题的一种解决办法

   最近项目上遇到一个很奇怪的问题,查询经常性的出错,这种出错是间歇性的。比如在代码中写select column1 from talbe1。执行完毕后Fill一个DataSet,再访问DataSet中的TableRow以及Column。通常会有一些莫名其妙的错误,例如
    Can not find Table 0.
    Column "column1" dose not belong to Table table.

   
在大多数情况下,没有任何问题,但是程序运行一会儿(不定期),就会出现这个问题。过一会儿可能也好了,但是几十分钟或几个小时后又出现了。
   
经过种种分析、排除,查找原因,最后把问题确定在connection.Close()的上。

SqlConnection.Close Method

http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdatasqlclientsqlconnectionclassclosetopic.asp

CAUTION   Do not call Close or Dispose on a Connection, a DataReader, or any other managed object in the Finalize method of your class. In a finalizer, you should only releaseunmanaged resources that your class owns directly. If your class does not own any unmanaged resources, do not include a Finalize method in your class definition. For more information, see Programming for Garbage Collection.

 

MSDN中文的链接,上面链接失效了。

http://blog.csdn.net/marising/archive/2009/03/26/4027135.aspx

 

 

根据这个文章,我们注释了log(日志记录)处的Finalize中的connection的close方法。问题得以解决,但是其原理百思不得其解。
最后,再提醒一下大家,DataReader要记得关闭,否则也会出一些问题。

------------------------------------------------------------------------------------------------------------------------------------------
总结一下
1.不要在Finalize中调用 Ado.net Connection和 DataReader的 Close或者 Dispose方法。
2.在程序中,要确保Connection和DataReader及时关闭,使用如 try catch finally或者 using。
3.在 Asp.net中, 切勿使用Static的 Connection

对于原因,我的猜想:ado.net已经作了数据库连接的缓存,在.net程序中关闭一个ado.net的连接,并没有真正的关闭数据库连接,它很可能再将这个连接分配给其他的线程;而asp.net是多线程的,如多个线程共用一个连接,会出现冲突,而冲突就会出现上面的问题。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值