例如下面的代码public class A
{
     private static readonly IDataAccess Datas = CreateDb();     public static DataSet SelectDb(int ID)
     {
         return(Datas.select("select * from a where ID=@ID",ID));
   
     }}
请问,当多人同时调用SelectDb(int ID)方法时,是否会发生数据冲突?因为Datas为Static变量

解决方案 »

  1.   


    //这样先声明一个静态只读的连接字符串
    public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["connstring"].ConnectionString;
    //然后再每个方法里
    using (SqlConnection conn = new SqlConnection(connectionString))
    {}
    //这样就没有问题了
      

  2.   

    当网站运行后,同一时间一定会有多个用户访问并使用这个对象中的select方法。所以,应该属于多线程了吧
      

  3.   

    会冲突啊,把static readonly 去掉就行啦public class A
    {
      private IDataAccess Datas = CreateDb();  public static DataSet SelectDb(int ID)
      {
      return(Datas.select("select * from a where ID=@ID",ID));
        
      }}
      

  4.   


    似乎去掉static是不能够在静态方法中用datas的
      

  5.   


    我本来以为这种问题不需要讨论的,看来死的都能变成活的
    请大家把MSDN看明白再说吧:
    http://msdn.microsoft.com/zh-cn/library/79b3xss3.aspx请注意这样的文字:
    无论对一个类创建多少个实例,它的静态成员都只有一个副本;
    静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值;
    C# 不支持静态局部变量
      

  6.   

    我从MSDN,和我的编程实践中一直认为:必然冲突
    甚至我还认为这就跟1+1=2一样不需要讨论我如果说的不对,请指正
      

  7.   


    对不起,我是菜鸟,我想请大侠给我举一个单线程冲突的例子好么?我实在是想不出来。在单线程的情况下,一个Static变量时如何同时在两个或两个以上的地方被调用
      

  8.   


    你以为asp.net的客户端程序不是访问同一个web应用程序吗?
      

  9.   


    所以嘛,MSDN都说了:
    静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值;
      

  10.   

    呵呵,这需要很大的耐心,而且要向那些不太容易读懂msdn的“所有势力之间共享”的含义的人用更生动的方式来讲。例如9点0分0秒的的时候用户A访问,持续访问时间为800毫秒,然后9点0分1秒的时候用户B访问,这就访问到了“共享的值”了。不过确实很少有人有这个耐心,因此csdn上其实也有风险,太“不假思索”的问题反而容易被一些很随便的错误回复左右。
      

  11.   

    所有势力之间共享  -->  所有实力之间共享其实可以看看《提问的艺术》,问问题的时候不要含沙射影,应该尽可能首先把问题中的背景讲清楚。例如你本来就打算将“Datas”共享。同时,回复就更不应该用含糊的字眼基于“不可靠”而诱导人。例如什么叫做在asp.net中“如果不是多线程?”,asp.net(至少2.0版以上)本来就是多线程来处理各个请求的!
      

  12.   

    另外,实际上这个问题,Datas是不是多线程安全的根本看不出来。谁知道lz的Datas.select方法是怎么写的呢?这种问题很难回答。我的选择就是掠过。但是反过来说,lz的提问使得别人不愿意花时间回复这种问题,甚至连“是”或者“不是”都无法做出判断,提问的方式有很大问题!
      

  13.   

    sp1234说得对,光这几行代码,不能断定是否有进程冲突的危险。
    总的来说,static类型的方法,有出现进程冲突的可能性,能不用尽量少用。winform因为基本上是单用户,static用的较多,web form里就不行了。用static方法要特别注意进程同步问题
      

  14.   


    再进一步说,createdb()一个静态方法,通过反射,返回数据访问层的方法。如:add/edit/delete/(数据库操作)我想询问的就是。当多人浏览网页并进行操作时,均为调用这个变量datas的一些方法。那么当datas被定义为static readonly时,是否会发生诸如:我传入的ID为1,但同时调用这个对象的另一个用户传入的是2。那么会造成数据返回冲突呢?还是说,多线程情况下。大家调用这个对象的方法时,是不会互相干扰的?不会有冲突问题发生?
      

  15.   

    如果楼主是因为不想在页面提交之后重新查询,而想到static数据集的办法,
    那么我认为,最好的办法就是每次都重新提交查询,获取新的数据集
      

  16.   


    并不是每次都要获取数据集。当初定义为static readonly是为了避免每次调用对象方法都要通过反射去生成方法实例。但我觉得这么定义有可能会发成多人同时访问出现冲突问题。所以如果改为在每个不同方法中都去生成一次操作实例如下:  public static DataSet SelectDb(int ID)
      {
        IDataAccess Datas = CreateDb();
        return(Datas.select("select * from a where ID=@ID",ID));
        
      }
      public static DataSet editDb(int ID)
      {
        IDataAccess Datas = CreateDb();
        return(Datas.select("select * from a where ID=@ID",ID));
      }
      

  17.   


    但我的一个同事说微软的petshop中就是用static readonly定义的。另外还说如果每次都调用反射创建对象很影响性能?不知道大家有何见解!
      

  18.   

    我送你一句话:
    先自己的程序,让别人学petshop去吧
      

  19.   

    微软搞个petshop
    不是教你面向对象编程,
    而不是教你怎样才是合适的分层,
    是告诉你:"看见了吧,asp.net是可以分层的,你要是不知道怎么分,这就是例子"
      

  20.   

    那要看你IDataAccess怎么实现的
      

  21.   

    IDataAccess 是接口。只有方法没有实现方法的。数据访问层继承接口层。通过反射创建数据逻辑层对象给接口变量,然后调用数据访问层中的方法!
      

  22.   

    说的不好听,在我眼里
    petshop就是垃圾
      

  23.   


    petshop是个软件,不是"别人都"这个东西
      

  24.   


    1、这不是这个贴的话题
    2、这是我一贯的观点,可以查看我在CSDN上相关发帖和回复
      

  25.   

    lock(this)
    {
    A.SelectDb(1)
    }
      

  26.   

    介意lz将什么是static你看看了解了解。你就知道什么时候用什么时候不用。