在ASP.NET Web服务(C#4.0)中打开和重用数据库连接的最佳做法是什么,该Web服务有大约5个使用相同数据库的Web方法?理想情况下,MS Access和SQL服务器的答案是相同的。
全球私人变量:
一个。优点:如果更改数据库提供程序,则易于维护
湾缺点:不能使用'使用'子句,连接可能会保持打开太长时间 - 连接会保持打开多长时间?
将db连接作为方法参数传递:
一个。优点:可以在不需要时使用'using'子句关闭连接
湾缺点:在任何地方维护和传递参数都很烦人
在任何方法中根据需要使用using子句打开和关闭连接:
一个。问题:这是最慢的,因为您必须多次重新打开相同的连接吗?或者因为幕后连接池这不慢?因此,这可能是最好的做法......?
湾问题:连接池是否仅与SQL Server相关,因此不适用于MS Access?
起初我正在考虑使用全局私有变量(OleDbConnection),因为我在Web方法和支持方法中使用了与主数据库的连接,并且将在不久的将来从MS Access迁移到SQL服务器并且很容易做出改变。
但在阅读了Obtaining SQL connection most efficiently when using ASP.NET and web services
之类的文章之后似乎我可以随时随地使用'using'子句创建一个新的连接,并且不会受到性能影响?
答案 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();
}