sqlreader极易引发并发问题? 以前用sqlreade,结果20个人左右访问的系统,动不动就出错。后来我全部换成dataset.问题解决?是sqlreader的事吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 通过Read()方法循环读取。 我怀疑是reader的时候锁定了这个数据库表,就无法进行编辑,插入操作。特别是一个表的信息量的时候,容易发生并发问题。 基本上,就是因为有些人搞什么画蛇添足的“共享SqlConnection”,自以为“提高效率”其实是根本就是逻辑冲突的。 这个情况很多是SqlConnection被设置成static造成的,数据连接对象不要写成static。 什么意思?这不是什么困难的测试。随便找两个人访问一下网站就知道bug了。另外,你试试在打开一个DbReader的同时再次使用(顺序地使用,根本扯不上“线程”)同一个DbConnection来处理另外一个读取数据库操作,立刻就垮掉了。这种“不允许共享——必须及时关闭DbConnection”的特性跟线程也没有关系。 我直截了当地说明问题出在“共享DbConnection上”,跟抛出一个(对于lz)莫名其妙的词儿“非线程安全”相比,哪一个更明确一些呢?这就好比如我说“手机电池没有及时充电,所以无法坚持7天”,你来一句“你直接说非永动机不就好了”,这种过于技术化的词儿其实在我们具体解决具体bug时,完全是“可以越少越好”。 没有用共享的SqlConnection,就是用了SqlDataReader,因为是程序是放在虚拟机里的,担心资源有限,所以用了SqlDataReader. 但我怀疑SqlDataReader读取时完全独占了这个表。 完全没用static的连接。就一个副本的连接肯定不行 dataset 也是通过datareader 构建的。 表是否被独占要看你的事务隔离级别或者语句,而不是是否使用的 DataReader。露珠提到:全部换成dataset.问题解决。这几乎就是连接没有关闭造成的,如果连接没有打开,DataAdapter.Fill 会替你打开连接然后关闭,使用 DataReader 时没有这种功能。 绝对关闭了 ,而且即使用Dataset不关闭也不会存在这种问题。 reader.Close();reader.Dispose();conn.Close();每次读取都添加这几句在后面。 static void HasRows(SqlConnection connection){ using (connection) { SqlCommand command = new SqlCommand( "SELECT CategoryID, CategoryName FROM Categories;", connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { Console.WriteLine("{0}\t{1}", reader.GetInt32(0), reader.GetString(1)); } } else { Console.WriteLine("No rows found."); } reader.Close(); }}这是从 msdn 网站上抄来的一段代码,供露珠参考 我用的是sqlhelper,读取过程跟这个一样。总之如果查询信息过多就挂掉了。至于共享的SqlConnection是绝对没用的。而且SqlDataReader确实也都关闭了。 而且我想即使不关闭也不至于产生错误。原因是它最多是占了一个Sqlconnection而已,不至于10几个人访问就挂掉。 b/s的话,有可能是iis连接池的设置问题,同时允许连接数不够 是不是把 reader 传给UI,执行绑定之类的操作了? 有一点可以确定,DbAdapter.Fill 内部也是使用 DataReader 的,绝对没有问题 如果UI里抛出异常,要确保reader和数据库连接会关闭。执行绑定需要时间,最好不要这么做 sqlreader要和using一起用using(sqlreader rd=xx.read){} cs文件中如何添加 GridView列 超链接【跪求大虾!!!!】 sql排序问题 请问ASP。NET服务器控件的生命周期有几个阶段啊??? Repeater 控件奇怪的問題 iis装不上 如何最快适应用C#的写编写.net web 请过来的前辈指点下! rational 2003和rational xde.net区别 如何的对存储过程返回的记录进行会页 一个dataset的update的问题,,急啊,,解出给分 关于wap图片显示 input 中输入拼音显示数据库内容问题 Android LBS App:春节在家无聊昨天忙活了一天,终于无师自学,开发了俺的第一个Android 程序
通过Read()方法循环读取。 我怀疑是reader的时候锁定了这个数据库表,就无法进行编辑,插入操作。特别是一个表的信息量的时候,容易发生并发问题。
什么意思?这不是什么困难的测试。随便找两个人访问一下网站就知道bug了。另外,你试试在打开一个DbReader的同时再次使用(顺序地使用,根本扯不上“线程”)同一个DbConnection来处理另外一个读取数据库操作,立刻就垮掉了。这种“不允许共享——必须及时关闭DbConnection”的特性跟线程也没有关系。
我直截了当地说明问题出在“共享DbConnection上”,跟抛出一个(对于lz)莫名其妙的词儿“非线程安全”相比,哪一个更明确一些呢?这就好比如我说“手机电池没有及时充电,所以无法坚持7天”,你来一句“你直接说非永动机不就好了”,这种过于技术化的词儿其实在我们具体解决具体bug时,完全是“可以越少越好”。
没有用共享的SqlConnection,就是用了SqlDataReader,因为是程序是放在虚拟机里的,担心资源有限,所以用了SqlDataReader. 但我怀疑SqlDataReader读取时完全独占了这个表。
完全没用static的连接。就一个副本的连接肯定不行
表是否被独占要看你的事务隔离级别或者语句,而不是是否使用的 DataReader。露珠提到:全部换成dataset.问题解决。这几乎就是连接没有关闭造成的,如果连接没有打开,DataAdapter.Fill 会替你打开连接然后关闭,使用 DataReader 时没有这种功能。
绝对关闭了 ,而且即使用Dataset不关闭也不会存在这种问题。
reader.Dispose();
conn.Close();每次读取都添加这几句在后面。
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open(); SqlDataReader reader = command.ExecuteReader(); if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}这是从 msdn 网站上抄来的一段代码,供露珠参考
我用的是sqlhelper,读取过程跟这个一样。总之如果查询信息过多就挂掉了。至于共享的SqlConnection是绝对没用的。而且SqlDataReader确实也都关闭了。 而且我想即使不关闭也不至于产生错误。原因是它最多是占了一个Sqlconnection而已,不至于10几个人访问就挂掉。
using(sqlreader rd=xx.read)
{}