在具有大约5个使用相同数据库的Web方法的ASP.NET Web服务(C#4.0)中打开和重用数据库连接的最佳实践是什么? 理想情况下,MS Access和SQL Server的答案是相同的。
全球私人变量:
一种。 优点:如果更改数据库提供商,则易于维护
湾 缺点:不能使用'using'子句,连接可能会保持打开太长时间 - 连接保持打开多长时间?
将db连接作为方法参数传递:
一种。 优点:可以在不需要时使用'using'子句关闭连接
湾 缺点:烦人的维护和传递param无处不在
在任何方法中根据需要使用using子句打开和关闭连接:
一种。 问题:这是最慢的,因为您必须多次重新打开相同的连接吗? 或者因为幕后连接池这不慢? 因此,这可能是最好的做法......?
湾 问题:连接池是否仅与SQL Server相关,因此不适用于MS Access?
起初我正在考虑使用全局私有变量(OleDbConnection),因为我在Web方法和支持方法中使用与主数据库的连接,并且将在不久的将来从MS Access迁移到SQL服务器并且将是容易做出改变。
但是在阅读了一些文章之后,比如在使用ASP.NET和Web服务时最有效地获取SQL连接
似乎我可以随时随地使用'using'子句创建一个新的连接,而不会受到性能影响?
ASP.Net 汇集了数据库连接,因此您不必担心这些低级别的详细信息。 看看这篇MSDN文章的技巧3 。
最佳做法是根本不重复使用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();
}