日期:2014-05-18  浏览次数:20438 次

[讨论] PetShop 中的 SQLHelper 类中的方法为什么全是静态的?
会不会出现并发问题?为什么?

==================================

请举例证明!!!

------解决方案--------------------
如果多个人调用,会排队等的。
跟调用存储过程一样。存储过程也只有1个,调用的时候就等候。
---------
测试过了吗?我测试过
http://community.csdn.net/Expert/topic/5555/5555903.xml?temp=.501034
存储过程会等待,不要乱说,存储过程是预编译过程,只有执行事务的锁等等才有此现象
------解决方案--------------------
不会并发的.
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

SqlCommand cmd = new SqlCommand();

using (SqlConnection conn = new SqlConnection(connectionString)) {
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}

连接对象不是静态的. 不会卡住.
写成静态除了性能以外就是对 OO的考虑了.
站在OO的角度分析,这些操作应该是类本身的,而不是类实列的,他们是这个类本身的功能,而不是类的每个对象特有的功能(不要和继承关系混淆).
(不考虑继承,已经是子类)比如狗这个类,吃,喝是属于这个种类本事所有的,应该申明为静态,而他的对象,就会有一些专属于对象自身的方法,比如独特的战斗方式,就应该是实列方法.
建议去MSDN 看看 OO中对STATIC的解释
btw:一家之言 个人看法 欢迎拍砖
------解决方案--------------------
我新弄的一个项目还采用了多线程,同时使用循环生成100万行数据,并加密后插入数据库......也是调用静态方法的.

事实证明,不会出现并发问题.


刚开始试过用存储过程插入100万行数据时,存储过程执行需要好几分钟,但不影响其它页面的查询操作.

事实证明,不会出现排队等候的情况.
------解决方案--------------------
总算有人说点靠普的了。
和状态无关的就用静态方法。
你要把SQLHelper里面的全部改成实例方法也没什么问题,
除了让你在调用的时候繁琐一点不会有什么好处。

至于为什么要设计成与状态无关,那是因为它被设计成工具类。
------解决方案--------------------
MSDN 中对 static 的说明,

静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。

明白?
------解决方案--------------------
使用静态类作为不与特定对象关联的方法的组织单元。此外,静态类能够使您的实现更简单、迅速,因为您不必创建对象就能调用其方法
------解决方案--------------------
看来你还不清楚调用函数的过程
函数调用是基于栈的,函数内的局部变量都保存在当前调用的栈空间上,每次调用栈空间都是不同的,不会发生你说的情况
------解决方案--------------------
静态类型的字段的内存空间,是分布在类型对象内部的。而这一块内存空间又是在类型创建到AppDomain时创建的,叫动态内存。
AppDomain我们都知道是线程安全的,不做特殊处理不会出现A线程访问B线程这种情况。
但是CLR并没有因为AppDomain是线程安全的就没做其他处理,他还使用了动态内存这种机制。也就是在引用该静态字段的时候才会创建内存,给与实例化、赋值。所以对于线程内部来说,只有在运行的时候才能得到该字段的值。
使用静态类的优点就在于,编译器会阻止你添加多余的类型实例。而并不是什么方便调用。这样的好处是很明显的。
所以正常情况下是不会出现你说的情况的。