【问题标题】:Making access to db static = bad?访问 db static = 不好?
【发布时间】:2013-03-09 19:49:54
【问题描述】:

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

单例类的实现如下所示:

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() 返回数据库类的新实例。

【问题讨论】:

  • IFactory这个接口是什么,尤其是GetDataBase()是做什么的?
  • 它返回一个新的数据库类实例。

标签: c# asp.net .net static


【解决方案1】:

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

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

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

【讨论】:

  • _factory.GetDatabase() 返回一个新的数据库类实例,它使用实体框架(仅供参考)。所以我想我发布的实现毕竟是好的?
  • @Poku 如果每个请求调用GetDatabase(),并在GetDatabase() 之前返回一个单独的EF 上下文,那么你应该没问题,是的
  • 根据请求调用它们。谢谢你澄清这一点。
  • 但要小心:每次访问属性Data时,都会创建一个新的数据库连接。我不认为属性吸气剂会产生那么大的副作用。我认为你应该在那里使用GetData() 的方法。
猜你喜欢
  • 2019-05-02
  • 2019-08-08
  • 2022-12-11
  • 1970-01-01
  • 2012-07-16
  • 2022-08-23
  • 2016-03-23
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多