我在这里看到了很多关于这个主题的讨论。
如果我有一个静态类w /静态方法连接到数据库或服务器,在多用户环境(如网页)中使用它是不是一个坏主意?这是否会让新用户在接受新用户之前等待以前用户的线程完成他们的呼叫?
多线程也会带来什么影响呢?
THX!
答案 0 :(得分:6)
如果每个静态方法完全负责获取其资源,然后将其资源置于方法调用的范围内(没有共享状态),那么您不应该遇到使用实例时不会遇到的线程问题类。但是,我建议,更大的问题是依赖公共静态方法(在静态或非静态类中)会在未来产生许多其他设计问题。
答案 1 :(得分:3)
静态方法在多线程方面没有任何特殊行为。也就是说,您可以预期该方法的几个“副本”同时运行。静态变量也是如此 - 不同的线程可以同时访问它们,没有等待。除非你小心,否则会造成混乱。
答案 2 :(得分:1)
是的,这是一个坏主意。
当您为所有用户使用一个连接时,如果有人执行需要的操作,比如说15秒,仅用于数据库访问,则所有其他用户必须等待才能连接到数据库
答案 3 :(得分:0)
这个问题有点紧张。至于为什么你有这么多静电。
但是我觉得你在询问线程问题,所以我想去看看有关线程的一些文档 ħttp://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx
答案 4 :(得分:0)
静态仅定义定义方法的范围,以及如何绑定/调用方法。它与多线程无关。
您需要注意静态字段。它们由所有线程共享。线程不是在等待彼此,但是你需要锁才能使它工作。
但是如果您的应用程序比Hello World复杂一点,您应该考虑让方法不是静态的,而是使用面向对象的模式。
答案 5 :(得分:0)
如果使用一个静态连接来访问数据库,则必须同步方法调用。通过单个连接向数据库询问数据的多个线程将......嗯......搞砸了。因此,您要序列化所有线程的数据访问权限,这将对性能产生很大影响。
如果每个调用都打开自己的连接,则不需要序列化所有线程,因为没有共享连接。每个请求创建一个连接仍然是一个昂贵的设计。
如果使用静态连接池,则会降低性能影响,因为您只需要序列化对连接池的访问。
此外,静力学通常不是一个好的设计决策 - 它们使单元测试变得非常复杂。您应该考虑使用Singleton或Monostate模式。
答案 6 :(得分:0)
如果你这样做正确,那就不会有问题了。如果你这样做错误,它就有可能强制顺序访问资源。
有时正确和错误之间的区别可能非常微妙且难以发现,但主要的是没有方法应该依赖或锁定类的任何“状态”(成员)。
答案 7 :(得分:0)
我对查找对象使用静态方法。我可以在一个地方(使用缓存)为asp.net应用程序管理所有查找对象,所有方法都使用静态方法调用它。
通过这种方式,我不需要在每次需要时实例化查找对象,并且它减少了调用DB以提高性能的需要。