2

在我完成的几个 .NET C# webservice 项目中,我在单例模式的帮助下访问了静态数据库。然后前几天我的朋友告诉我这是一件坏事,因为如果对同一个数据库实体发出大量请求,那么数据库将因为静态实例而被锁定。我朋友的假设是对的吗?我认为每个新请求都会创建一个新的类实例?

单例类的实现如下所示:

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 类的新实例。

4

1 回答 1

2

查看WebServiceImpl,所有调用都将共享一个WebService实例。现在,这不一定是问题,具体取决于实现方式;例如,如果_factory.GetDatabase();最终被每个请求调用,那么可能是你侥幸逃脱了。进一步取决于什么GetDatabase()- 即每次调用都会获得一个新实例吗?还是每次都给您相同的实例?简单地说:我们那里没有足够的信息来完全回答。但:

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

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

于 2013-03-09T19:55:30.630 回答