【问题标题】:Custom Database Connection Object: Should i use a general one (singleton) or one per object instance?自定义数据库连接对象:我应该使用一个通用的(单例)还是每个对象实例一个?
【发布时间】:2019-04-26 09:28:18
【问题描述】:

最佳实践是什么:只创建一个静态类(Singleton)来提供所有需要的数据库连接,或者为每个 DAO 实例创建一个对象? 请注意,我的项目同时访问多个数据库,因此我创建了一个类AcessoBanco,它接收一个 .INI 配置文件 e 返回我需要的所有连接。 我使用的是单个静态类方法,但由于系统执行一些多线程任务,我收到了关于并发的零星异常。我通过在AcessoBanco 类中创建锁来解决它,但是,这真的是个好主意吗? 也许,如果我为每个 dao 对象放置一个 AcessoBanco 实例,并发问题可以更优雅地解决,对吗?一些例子:

使用单例方法

public class Repository1
{
    public Repository1(string iniFilePath)
    {
        AcessoBanco.Configure(iniFilePath); // Singleton that creates all the connections (concurrency excepction solved using locks)

        // After configured, just call AcessoBanco.GetConnections() in any point of the code to get the connections 
    }
}

每个对象使用一个实例

public class Repository2
{
    public AcessoBanco Conexoes { get; set; }
    public Repository2(string iniFilePath)
    {
        Conexoes = new AcessoBanco(iniFilePath); // Using one instance of AcessoBanco in each DAO. I will need to do it in every DAO.
    }
}

【问题讨论】:

    标签: c# repository-pattern dao data-access-layer data-access


    【解决方案1】:

    您提供的详细信息并不表明使用单例模式是一个好主意;相反,正如您已经发现的那样,它可能会导致多线程应用程序出现问题。大多数数据库引擎都支持连接池,打开/关闭连接的开销应该是最小的。也不要提前打开连接。只需在您严格需要的时候打开/关闭连接。你正在制造比你需要的更多的头痛。

    这样或类似的模式没有任何问题:

    using (var connection = new Connection()){
    
    }
    

    【讨论】:

    • 是的,我同意,但是我的应用程序用户的数据库数量可变,我需要提前知道可用数据库的列表是什么。 AcessoBanco 类帮我评估 .ini 文件。我的问题是:我只需要创建一次可用数据库列表(例如:在应用程序启动时)或每次需要连接时。
    【解决方案2】:

    这在很大程度上取决于您使用的数据库类型。

    仅举两个例子:

    1. CosmosDB - 建议使用客户端的单例实例,因为它使用(最常见的)http 调用,喜欢 HttpClient 单例实例
    2. ADO.NET(用于 sql server)- 拥有单例实例是非常糟糕的主意,因为您的应用程序可能想要使用来自不同线程的连接,您会遇到一大堆不同的问题。这正是它在底层使用连接池的原因。

    【讨论】:

    • 我使用 SQL Server。所以,每个实例一个连接,对吧?
    • 每个实例是什么?
    • 每个需要访问数据库(我的道)的对象实例,每个需要访问数据库的对象都有自己的AcessoBanco实例。我们说的是同一件事?
    • 没有。您希望尽可能晚地打开连接并尽早关闭它。这意味着要么使用open()close(),要么使用@Icarus 提到的using 块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2015-12-25
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多