请问一个性能问题,欢迎讨论
我想知道下面两种方式,哪种效率较高:
一、
public static int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(connString)) {
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}
使用:SQLHelper.ExecuteNonQuery(a,b,c)这样开发者使用方便。这是petshop3.0里面的例子
二、
public int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(connString)) {
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}
使用:
SQLHelper sh=new SQLHelper();
sh.ExecuteNonQuery(a,b,c)
再问:使用using (SqlConnection conn = new SqlConnection(connString))这种方式,在静态里关闭会及时吗?
[解决办法]
这个东西不是很重要的.重要的是查询的时候要建好索引..这个性能才是很大的
[解决办法]
80%和20% 精力不要放在这种东西上面啊.
[解决办法]
一看public static int ExecuteNonQuery有static就不打算用了。
完全为了偷懒不写new
[解决办法]
不回答你问题的是因为他们没有使用过 SQLHelper 。
程序里每一个细节都应该考虑。能了解的就了解。
说不用考虑什么什么的,他们是为了完成项目而完成。并没有提高自己的意识。
[解决办法]
使用using (SqlConnection conn = new SqlConnection(connString))这种方式
不管在哪里都是没什么问题的。
我没有弄明白的是:如果使用 static的方式会不会造成用户等待的情况。
假设一种情况
1、使用static的方式(也就是方式一)
2、一千个人同时访问(对于大型网站不是很难得的事情吧)
在这种情况下会不会发生有一个人要等到其他的999人都访问完毕之后才会轮到他。
我对于静态函数很不了解,也许我的想法根本就是错误的,不过既然是静态的,那么内存里只会有着一个函数,一千个人都会使用这一个函数,势必会出现等待的情况;
如果说是多线程的话,那么内存里就不止这一个函数了,有多少个线程就会出现多少个函数吗?
如果是这样的话,那么和new 有多大的区别呢?
PS:
我一直使用new的方法,有几点原因:
1、对于静态函数不了解,不敢使用。
2、静态了,存储过程的参数就不好处理了。
3、静态的情况,事务也是不太好处理的。
但是现在看看服务器上网站占用的内存——比我想象的大了许多,访问量不太高就已经达到了386M,SQL才占了200多M。不知道是不是new的原因。
程序也没有缓存什么数据,分页也处理的挺好,这方面是不会占用什么内存的。
要是能够分析出来那些地方占用内存就好了。
[解决办法]
个人比较偏向与静态的,方便真的很方便!
不过如果真的很多人同时在用那么肯定会影响速度,
如果用new的话可能会多耗内存,但是用完后马上就释放掉了
有什么好担心的呢?
[解决办法]
为什么不把那个类继承IDisposable呢?
在Dispose方法里回收资源呢?
[解决办法]
楼上兄弟,C#资源回收它自己会完成吧
---------------------------------------
这点偶强列建议你自已完成回收,因为你根本不知道GC什么时候来执行这个动作.
那么这段时间内,资源岂不是浪费...
对于new和static的性能问题,到还真没怎么在意过....这个问题估计只有愚翁能给出答案....
另外,我不觉得楼主是在钻牛角尖,支持下.....
------解决方案--------------------
我也很占同搂主的精神,一个地方是应该很好的研究一下的,一个页面要访问多少次数据库呀!
不弄好了效率一定会受到影响的。
[解决办法]
http://blog.csdn.net/jyk
这里有我的处理数据访问的方法,不知道对搂主有没有帮助。
[解决办法]
方法本身没有问题,如果同时10个人使用,变量是局部变量的话就什么事也没有.如果是共用变量的话,就有并发的问题了.
同样用new的时候,同时有10个人使用这个对象的方法,遇到的问题是一样的.
[解决办法]
呵呵,看到这么多人回帖,只想说,支持楼主。
这个静态问题,我可以从火海里面爬出来的,碰到了很多次致命打击呀。
第一次,我把连接用的那个变量conn声明为静态,发现速度真快,但是当访问人数节节上升的时候,我盯着日志,人数达到某个边界的时候,一下子,所有访问者,都崩溃了,呵呵。
后来改了每次都new,慢了好多……
用using,很明智,它的意思就是,在using的范围内分配的资源,在离开这个范围时,都将会被回收,包括连接关闭、打开的文件关闭。renturn也算离开这个范围,所以,你更不不用担心这个方法是静态还是非静态,因为他们的作用一摸一样,建议使用静态。(我刚看你第一个帖子的时候就纳闷了,写两个一摸一样的方法干嘛哪)呵呵,所有不涉及类成员的方法,建议使用静态。
这个跟线程安全有什么关系呀?????搞不懂。
线程安全的意思是说,如果多个线程调用这个方法,要保证安全,不冲突。认真看看,方法里面用到的变量,都是参数传进来的,根本不存在冲突的问题。线程安全的问题倒是比较多出现在静态变量上,比如我上面碰到的那次(静态Conn),就属于线程安全问题,所有使用这个静态Conn的方法,不管你静态不静态,都是线程不安全的。
**************************************
http://www.nnhy.org
[解决办法]
楼上有以为提到静态不方便使用事务的问题,其实,你可以把事务作为一个参数传进来的。
近来对一个省级电网的办公网站进行优化,收获不少,大家可以一起交流一下。
**************************************
http://www.nnhy.org