0

在具有大约 5 个使用相同数据库的 Web 方法的 ASP.NET Web 服务(C# 4.0)中打开和重用数据库连接的最佳实践是什么?理想情况下,MS Access 和 SQL 服务器的答案是相同的。

  1. 全局私有变量:

    一个。优点:如果更改数据库提供程序,易于维护

    湾。缺点:不能使用“using”子句,连接可能保持打开太久——连接大约保持打开多长时间?

  2. 将 db 连接作为方法参数传递:

    一个。优点:可以在不需要时关闭连接使用'using'子句

    湾。缺点:到处维护和传递参数很烦人

  3. 在任何方法需要时使用 using 子句打开和关闭连接:

    一个。问题:这是最慢的,因为您必须多次重新打开同一个连接?或者因为幕后的连接池,这不是更慢吗?因此,这可能是最佳实践……?

    湾。问题:连接池是否仅与 SQL 服务器相关,因此不适用于 MS Access?

起初我正在考虑使用全局私有变量(OleDbConnection),因为我在 Web 方法和支持方法中使用到主数据库的连接相当多,并且将在不久的将来从 MS Access 迁移到 SQL Server,并将很容易做出改变。

但是在阅读了一些文章后,例如使用 ASP.NET 和 Web 服务时最有效地获取 SQL 连接

似乎我可以使用“使用”子句在任何地方按需创建新连接而不会受到性能影响?

4

2 回答 2

1

ASP.Net将数据库连接化,因此您不必担心这些低级细节。查看这篇 MSDN 文章的提示 3

于 2012-10-10T13:57:55.487 回答
1

最佳做法是根本不重用您的 Connection 对象。

public void GetEmployees() As List<Employee> {
    var employees = new List<Employee>();
    using (var connection = new SqlConnection(Configuration.ConnectionString)) {
        using (var command = connection.CreateCommand()) {
            command.CommandText = "SELECT * FROM dbo.Employee";
            connection.Open();
            using (var reader = command.ExecuteReader()) {
                while (reader.Read()) {
                    employees.Add(Employee.CreateRecordFromOpenReader(reader));
                }
            }
        }
    }

    return employees;
}

然后,如果您需要使用此功能的任何事务,请设置 DTC 并执行此操作。

using (var scope = new TransactionScope()) {
    var employees = GetEmployees();
    employees.Map((e) => e.Status = Status.Active);
    scope.Complete();
}
于 2012-10-10T13:59:51.580 回答