最佳实践是什么:仅创建一个单一的静态类(Singleton)来提供与数据库的所有必需连接,或者为每个DAO实例创建一个对象?
请注意,我的项目同时访问多个数据库,因此我创建了一个类AcessoBanco
,该类收到一个.INI配置文件,e返回我所需的所有连接。
我使用的是单个静态类方法,但由于系统执行一些多线程任务,因此收到了有关并发的零星异常。我通过在AcessoBanco
类中创建锁来解决它,但这真的是个好主意吗?
也许,如果我为每个dao对象放置一个AcessoBanco
实例,则可以更优雅地解决并发问题,对吗?一些例子:
使用Singleton方法
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.
}
}
答案 0 :(得分:1)
您提供的详细信息并不表示使用Singleton模式是一个好主意。相反,正如您已经发现的,它可能会导致多线程应用程序出现问题。大多数数据库引擎都支持连接池,打开/关闭连接的开销应该最小。也不要提前打开连接。只需在严格需要的时间打开/关闭连接即可。您正在制造比需要更多的头痛。
像这样的模式或类似的东西没有错:
using (var connection = new Connection()){
}
答案 1 :(得分:0)
这在很大程度上取决于您使用哪种类型的数据库。
仅2个示例:
CosmosDB
-建议使用客户端的单例实例,因为它使用(最经常)喜欢HttpClient
单例实例的http调用ADO.NET
(对于sql server)-具有单例实例是一个非常糟糕的主意,因为您的应用程序可能想要使用来自不同线程的连接,并且您会遇到很多其他问题。这就是为什么它在后台使用连接池的原因。