我的网络应用程序有以下类:
public class DatabaseProvider {
private readonly IDbConnection _cn;
public DatabaseProvider(IDbConnection cn) {
_cn = cn;
}
public void ExecuteNonQuery(string query) {
// Execute the query
var cmd = _cn.CreateCommand();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}
}
使用以下代码(使用 Microsoft Unity)声明 IDbConnection 依赖项:
container.RegisterType<IDbConnection>(new InjectionFactory(c => {
var cn = new SqlConnection("...");
cn.Open();
return cn;
}));
这允许我像这样换出与 SQLite 的连接:
container.RegisterType<IDbConnection>(new InjectionFactory(c => {
var cn = new SQLiteConnection("Data Source=:memory:;Version=3;");
cn.Open();
return cn;
}));
我在测试时使用 SQLite,连接必须保持打开状态,否则数据会丢失。因此我不能只在需要时打开和关闭连接。
我总是在需要时打开与数据库的连接,想知道这是否适用于大型应用程序?
对于如何改进这一点的任何建议,我将不胜感激。谢谢
最佳答案
作为 ADO.NET 中的一般规则,必须尽快关闭连接。
连接从连接池中重用,是稀缺资源。
推荐的方法是使用 () {} 结构。
SQL Server Connection Pooling (ADO.NET)
我们强烈建议您在使用完后始终关闭连接,以便连接返回到连接池。您可以使用 Connection 对象的 Close 或 Dispose 方法,或者通过在 C# 中的 using 语句 或 Visual Basic 中的 Using 语句中打开所有连接来执行此操作。未明确关闭的连接可能不会添加或返回到池中。有关详细信息,请参阅使用语句(C# 引用)或如何:处理 Visual Basic 的系统资源 (Visual Basic)。
所以,我建议你做一个接口(interface)IDbProvider,然后做2个实现:SqlServerProvider和SQLiteProvider,并在里面处理打开和关闭连接他们。然后使用 Unity 绑定(bind)一个或另一个提供程序。
关于c# - 让数据库连接保持打开状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12819728/