如何在ASP.Net应用程序中管理数据库连接?
我的理解告诉我,“最好”的方法是打开连接,进行查询,关闭连接 - 并多次执行此操作,因为连接池会使成本可以忽略不计。
问题来自于我有一个DAL,其中每个方法都在寻找自己的连接。 E.G。
User x = DAL.GetUserDetails(); Customer y = DAL.GetCustomer();
在我们开始谈论TransactionScope
之前,这很好using (TransactionScope t.... { DAL.UpdateCustomer(y); DAL.UpdateUser(x); t.Complete(); }
ASP.Net现在想要使用DTC,因为(我猜)有多个连接。
有人会说“缓存连接somwhere”但我需要明确销毁连接,因为我管理安全性的方式(执行/恢复)并且我不想每次都要调用这样做的页面,因为有人会忘记拨打电话。我也可以将连接传递给每个方法,但这并不理想,因为页面必须管理连接。
我是否有意义或者我错过了一些基本的东西?
答案 0 :(得分:1)
我正在某个地方读书而且我不记得微软要解决的问题当你有两个连接到同一个数据库时他们不会升级到DTC会导致这个问题消失。
在那之前我们做的是开发我们的TransactionScope,然后我们的DAL会要求TS提供新的连接,当我们处理TS时它会关闭连接。
连接存储在LogicalCallContext中,尽管我会考虑使用HTTP Context。我在应用程序上线之前离开了公司,但从我听说他们没有任何问题。
所以你有
using (CustomTS.New())
{
CustomerDal.Update()
userDal.Update()
}
CustomTS有一个静态方法可以获得当前的事务和连接。
答案 1 :(得分:0)
以类似的方式实现它,以了解TransactionContext的工作原理。
我开始编写如何做到这一点,但我认为一个例子使它更清晰:
public class MyConnectionManager : IDisposable
{
[ThreadStatic] // static per thread
private static SqlConnection con;
public static SqlConnection Connection
{
get
{
if (con == null)
{
con = new SqlConnection();
con.Open();
}
return con;
}
}
public void Dispose()
{
if (con != null)
{
con.Close();
}
}
}
public class Program
{
public void Run()
{
using(new MyConnectionManager())
{
MakeCall();
MakeCall();
} // Disposal happens here
}
public void MakeCall()
{
// The property can be accessed from anywhere
SqlCommand cmd = new SqlCommand("SELECT 1", MyConnectionManager.Connection);
}
}
这将导致using语句范围内的任何调用使用相同的连接,只要它们都在同一个线程上运行即可。您也可以在其中抛出事务上下文。
警告:在ASP.NET WebPages场景中,线程可以在connection和page_load之间进行更改。 See this article for more info。线程也被重用了。但是,如果您正在开发在应用程序之间共享的DAL,则可能无法使用所提及的HttpContext,因为没有。