例如下面的代码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变量
{
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变量
//这样先声明一个静态只读的连接字符串
public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["connstring"].ConnectionString;
//然后再每个方法里
using (SqlConnection conn = new SqlConnection(connectionString))
{}
//这样就没有问题了
{
private IDataAccess Datas = CreateDb(); public static DataSet SelectDb(int ID)
{
return(Datas.select("select * from a where ID=@ID",ID));
}}
似乎去掉static是不能够在静态方法中用datas的
我本来以为这种问题不需要讨论的,看来死的都能变成活的
请大家把MSDN看明白再说吧:
http://msdn.microsoft.com/zh-cn/library/79b3xss3.aspx请注意这样的文字:
无论对一个类创建多少个实例,它的静态成员都只有一个副本;
静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值;
C# 不支持静态局部变量
甚至我还认为这就跟1+1=2一样不需要讨论我如果说的不对,请指正
对不起,我是菜鸟,我想请大侠给我举一个单线程冲突的例子好么?我实在是想不出来。在单线程的情况下,一个Static变量时如何同时在两个或两个以上的地方被调用
你以为asp.net的客户端程序不是访问同一个web应用程序吗?
所以嘛,MSDN都说了:
静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值;
总的来说,static类型的方法,有出现进程冲突的可能性,能不用尽量少用。winform因为基本上是单用户,static用的较多,web form里就不行了。用static方法要特别注意进程同步问题
再进一步说,createdb()一个静态方法,通过反射,返回数据访问层的方法。如:add/edit/delete/(数据库操作)我想询问的就是。当多人浏览网页并进行操作时,均为调用这个变量datas的一些方法。那么当datas被定义为static readonly时,是否会发生诸如:我传入的ID为1,但同时调用这个对象的另一个用户传入的是2。那么会造成数据返回冲突呢?还是说,多线程情况下。大家调用这个对象的方法时,是不会互相干扰的?不会有冲突问题发生?
那么我认为,最好的办法就是每次都重新提交查询,获取新的数据集
并不是每次都要获取数据集。当初定义为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));
}
但我的一个同事说微软的petshop中就是用static readonly定义的。另外还说如果每次都调用反射创建对象很影响性能?不知道大家有何见解!
先自己的程序,让别人学petshop去吧
不是教你面向对象编程,
而不是教你怎样才是合适的分层,
是告诉你:"看见了吧,asp.net是可以分层的,你要是不知道怎么分,这就是例子"
petshop就是垃圾
petshop是个软件,不是"别人都"这个东西
1、这不是这个贴的话题
2、这是我一贯的观点,可以查看我在CSDN上相关发帖和回复
{
A.SelectDb(1)
}