挺早以前的帖子了,
Ado.net间歇性出现莫名其妙问题的一种解决办法
====================================================
某网友来信
程序代码中写“select column1 from table1” 返回DataSet ds 有时候访问ds.Table[0]提示:Cannot find table 0. 有时候访问ds.Table[0].Rows[0]["column1"]提示:Column “column1” does not belong to table Table 大部分情况下,程序正常,但是偶尔会出现上面的错误。 因此,我考虑,是不是sqlServer本身返回ds的时候就没有正确的返回结果?但是什么会导致sqlServer没有正确的返回ds呢?大家帮我想想,拜托了。 我也是有时候出现你的这个问题,不知道怎么解决?
=======================================================
因为有几个网友都来信问过此类问题,所以我统一回复一下。一般出现此类问题,就应该是连接出问题了。
-
Asp.net和WebService的程序,都是多线程的,一般有多少人同时访问,就有多少个SqlConnection。
-
数据库的连接数量一般时几十个,总数是比线程数量要小(并发可以达到几百,连接数只有几十)。这就是为什么说晚申请,早释放的原因,因为数据库连接的资源是非常宝贵的。
-
SqlConnection的Close方法是把Connection还给连接池,而Dispose的方法是彻底关闭和释放连接。因此,在程序中
切记不可手工调用Dispose的方法 。一是不安全,二是效率不高。
-
在程序中,有一些人喜欢用Static的SqlConnection,这也是不对的,
在多线程的情况下, 请避免使用静态SqlConnection实例 。静态实例,在多线程情况下,会产生系统紊乱。
-
还有一些在程序中忘记Close,看起来不会有什么问题,但是会导致连接耗尽,系统的并发数量上不去。因此,
使用完毕尽快关闭数据库连接 。
-
出现此类问题的原因,我感觉是程序中
先调用了Close,再调用了D
ispose,假如Thread1申请了SqlCon1,Close后,SqlCon1还给了线程池,但是Thread1还是持有SqlCon1对象,Thread2这时候申请连接,线程池把SqlCon1给了Thread2,SqlCon1在执行查询时,Thread1调用了SqlCon1的Dispose,那么此时发生了什么?肯定Thread2的查询被中断,你去访问DataSet中的Table或者Table中的Column,就会没有。出现此类问题,只有一个解释:查询被中断了。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|