c# - 让数据库连接保持打开状态?

标签 c# sql-server sqlite unit-testing unity-container

我的网络应用程序有以下类:

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个实现:SqlServerProviderSQLiteProvider,并在里面处理打开和关闭连接他们。然后使用 Unity 绑定(bind)一个或另一个提供程序。

关于c# - 让数据库连接保持打开状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12819728/

相关文章:

c# - 如何使用 SQLite.Net 设置多个 PRAGMA?

sql - sql中IF语句的简写

sql - 使用 CTE 进行递归查询

SQL内连接两个具有相同列名的表

c# - C# 中的成员传递?

C# 属性问题

c# - 使用方括号围绕字符串值反序列化 JSON

c# - 如何使用户控件表现为单选按钮

sql - 在 SQL Server 中评估 "value1 IS NOT DISTINCT FROM value2"的最佳方法

ios - ios中如何用核心数据提高大数据导入性能