ASP.NET中重用MS Access迁移到SQL Server的数据库连接的最佳做法是什么?

时间:2012-10-10 13:50:53

标签: c# asp.net connection connection-pooling

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

  1. 全球私人变量:

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

    湾缺点:不能使用'使用'子句,连接可能会保持打开太长时间 - 连接会保持打开多长时间?

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

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

    湾缺点:在任何地方维护和传递参数都很烦人

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

    一个。问题:这是最慢的,因为您必须多次重新打开相同的连接吗?或者因为幕后连接池这不慢?因此,这可能是最好的做法......?

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

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

    但在阅读了Obtaining SQL connection most efficiently when using ASP.NET and web services

    之类的文章之后

    似乎我可以随时随地使用'using'子句创建一个新的连接,并且不会受到性能影响?

2 个答案:

答案 0 :(得分:1)

ASP.Net 数据库连接,因此您不必担心这些低级别的详细信息。看看Tip 3 of this MSDN article

答案 1 :(得分: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();
}