访问db static = bad?

时间:2013-03-09 19:49:55

标签: c# asp.net .net static

在我所做的几个.NET C#webservice项目中,我借助单例模式访问了db static。然后前几天我的朋友告诉我这是一件坏事,因为如果对同一个db实体提出了很多请求,那么db会因为静态实例而被锁定。我朋友的假设是对的吗?我以为每个新请求都会成为该类的新实例?

单例类的实现如下所示:

public class WebService
{
    private readonly IFactory _factory;

    public WebService(IFactory factory)
    {
        _factory = factory;
    }

    public IDataRepository Data
    {
        get
        {
            return _factory.GetDatabase();    
        }            
    }
}

public static class WebServiceImpl
{
    private static readonly WebService _webService = new WebShop(new WebserviceFactoryImpl());

    public static WebService webService { get { return _webService; } }

}

_factory.GetDatabase()返回Database类的新实例。

1 个答案:

答案 0 :(得分:2)

查看WebServiceImpl,所有来电都将共享一个WebService个实例。现在,这不是必然问题,具体取决于实现方式;例如,如果_factory.GetDatabase();最终被按请求调用,则可能是您正在逃避它。进一步取决于GetDatabase()的作用 - 即它是否每次调用获得一个新实例?或者它每次都给你相同的实例?简单地说:我们没有足够的信息可以完全回答。但是:

  • 在请求之间共享单个数据库连接是危险的;要么你需要锁定/同步,要么你冒着很多错误(数据库连接通常不会编写为线程安全的)
  • 在请求之间共享ORM甚至更糟糕:除了以上所有内容之外,您还会遇到在身份/对象缓存中累积数据的问题; ORM实例(数据上下文等)意图是短暂的,然后被丢弃(有时候被丢弃)

对数据库进行静态访问不一定是个问题;这一切都归结为如何实现 - 例如,基于静态的API仍然可以在每次调用时创建(和配置)连接。