sqlreader极易引发并发问题?

Neutri 2013-02-17 09:49:44
以前用sqlreade,结果20个人左右访问的系统,动不动就出错。后来我全部换成dataset.问题解决?是sqlreader的事吗?
...全文
307 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
md5e 2013-02-20
  • 打赏
  • 举报
回复
sqlreader要和using一起用 using(sqlreader rd=xx.read) { }
theillusion 2013-02-20
  • 打赏
  • 举报
回复
如果UI里抛出异常,要确保reader和数据库连接会关闭。执行绑定需要时间,最好不要这么做
indusl 2013-02-20
  • 打赏
  • 举报
回复
引用 21 楼 theillusion 的回复:
是不是把 reader 传给UI,执行绑定之类的操作了?
是的
cfreez 2013-02-18
  • 打赏
  • 举报
回复
b/s的话,有可能是iis连接池的设置问题,同时允许连接数不够
Neutri 2013-02-18
  • 打赏
  • 举报
回复
引用 17 楼 theillusion 的回复:
C# code ? 1234567891011121314151617181920212223242526 static void HasRows(SqlConnection connection) { using (connection) { SqlCommand command = new SqlCommand( "SE……
我用的是sqlhelper,读取过程跟这个一样。总之如果查询信息过多就挂掉了。至于共享的SqlConnection是绝对没用的。而且SqlDataReader确实也都关闭了。 而且我想即使不关闭也不至于产生错误。原因是它最多是占了一个Sqlconnection而已,不至于10几个人访问就挂掉。
theillusion 2013-02-18
  • 打赏
  • 举报
回复
有一点可以确定,DbAdapter.Fill 内部也是使用 DataReader 的,绝对没有问题
theillusion 2013-02-18
  • 打赏
  • 举报
回复
是不是把 reader 传给UI,执行绑定之类的操作了?
ltcszk 2013-02-17
  • 打赏
  • 举报
回复
你直接说非线程安全不就好了
  • 打赏
  • 举报
回复
如果弄了这类“共享”还不知道、还上线,那么请首先检查你们公司的员工有没有实践经验而又(因为决策层问题)根本无法真正提高技术。因为这还只是一些公司噩梦的开始.......
  • 打赏
  • 举报
回复
基本上,就是因为有些人搞什么画蛇添足的“共享SqlConnection”,自以为“提高效率”其实是根本就是逻辑冲突的。
Neutri 2013-02-17
  • 打赏
  • 举报
回复
引用 1 楼 gxingmin 的回复:
应该不是吧,你是怎么链接数据库和怎读取的?
通过Read()方法循环读取。 我怀疑是reader的时候锁定了这个数据库表,就无法进行编辑,插入操作。特别是一个表的信息量的时候,容易发生并发问题。
gxingmin 2013-02-17
  • 打赏
  • 举报
回复
应该不是吧,你是怎么链接数据库和怎读取的?
theillusion 2013-02-17
  • 打赏
  • 举报
回复
露珠发上你的代码看看
theillusion 2013-02-17
  • 打赏
  • 举报
回复
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 网站上抄来的一段代码,供露珠参考
indusl 2013-02-17
  • 打赏
  • 举报
回复
reader.Close(); reader.Dispose(); conn.Close(); 每次读取都添加这几句在后面。
indusl 2013-02-17
  • 打赏
  • 举报
回复
引用 14 楼 theillusion 的回复:
引用 9 楼 indusl 的回复: 没有用共享的SqlConnection,就是用了SqlDataReader,因为是程序是放在虚拟机里的,担心资源有限,所以用了SqlDataReader. 但我怀疑SqlDataReader读取时完全独占了这个表。 表是否被独占要看你的事务隔离级别或者语句,而不是是否使用的 DataReader。露珠提到:全部换成dataset.问题解决。这几乎就是连……
绝对关闭了 ,而且即使用Dataset不关闭也不会存在这种问题。
theillusion 2013-02-17
  • 打赏
  • 举报
回复
引用 9 楼 indusl 的回复:
没有用共享的SqlConnection,就是用了SqlDataReader,因为是程序是放在虚拟机里的,担心资源有限,所以用了SqlDataReader. 但我怀疑SqlDataReader读取时完全独占了这个表。
表是否被独占要看你的事务隔离级别或者语句,而不是是否使用的 DataReader。露珠提到:全部换成dataset.问题解决。这几乎就是连接没有关闭造成的,如果连接没有打开,DataAdapter.Fill 会替你打开连接然后关闭,使用 DataReader 时没有这种功能。
Kilin_Zhang 2013-02-17
  • 打赏
  • 举报
回复
引用 11 楼 lovelium 的回复:
你reader后有没有close
有可能
winner2050 2013-02-17
  • 打赏
  • 举报
回复
dataset 也是通过datareader 构建的。
lovelium 2013-02-17
  • 打赏
  • 举报
回复
你reader后有没有close
加载更多回复(5)

62,242

社区成员

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

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

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

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