使访问db static =坏

本文关键字:static db 访问 | 更新日期: 2023-09-27 18:03:12

在我所做的几个。net c# webservice项目中,我使用了单例模式来访问db static。然后有一天我的朋友告诉我,这是一件不好的事情,因为如果对同一个数据库实体发出了很多请求,那么数据库就会因为静态实例而被锁定。我朋友的假设对吗?我认为每个新请求都会创建一个类的新实例?

单例类的实现是这样的:

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

使访问db static =坏

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

  • 在请求之间共享单个数据库连接是危险的;要么你需要锁定/同步,要么你冒着大量错误的风险(数据库连接通常不是写为线程安全的)
  • 在请求之间共享ORM甚至更糟:除了上面的所有问题之外,您还会遇到数据在身份/对象缓存中积累的问题;ORM实例(数据-上下文等)旨在是短暂的,然后被丢弃(有时:丢弃)
对数据库进行静态访问不一定是个问题;这一切都归结为如何实现—例如,基于静态的API仍然可以在每次调用时创建(和处置)一个连接。