连接管理ASP.net

连接管理ASP.net,asp.net,ado.net,Asp.net,Ado.net,如何在ASP.Net应用程序中管理数据库连接 我的理解告诉我,“最好”的方法是打开一个连接,进行查询,关闭连接,并多次这样做,因为连接池使成本可以忽略不计 当我有一个DAL时,问题就来了,其中每个方法都负责自己的连接。例如 User x = DAL.GetUserDetails(); Customer y = DAL.GetCustomer(); 用户x=DAL.GetUserDetails(); 客户y=DAL.GetCustomer(); 在我们开始讨论TransactionScope之前,

如何在ASP.Net应用程序中管理数据库连接

我的理解告诉我,“最好”的方法是打开一个连接,进行查询,关闭连接,并多次这样做,因为连接池使成本可以忽略不计

当我有一个DAL时,问题就来了,其中每个方法都负责自己的连接。例如

User x = DAL.GetUserDetails(); Customer y = DAL.GetCustomer(); 用户x=DAL.GetUserDetails(); 客户y=DAL.GetCustomer(); 在我们开始讨论TransactionScope之前,一切都很好

using (TransactionScope t.... { DAL.UpdateCustomer(y); DAL.UpdateUser(x); t.Complete(); } 使用(TransactionScope t。。。。 { DAL.UpdateCustomer(y); DAL.UpdateUser(x); t、 完全(); } ASP.Net现在想使用DTC,因为(我猜)涉及多个连接

有人会说“缓存连接somwhere”,但由于我管理安全性的方式(执行为/revert),我需要显式地破坏连接我不想在每个页面上都调用,因为有人会忘记调用。我也可以将连接传递到每个方法中,但这并不理想,因为页面必须管理连接


我说的有道理吗?或者我错过了一些基本的东西吗?

我在某个地方读到过,我不记得微软会在哪里解决这个问题,当你有两个连接到同一个数据库时,它们不会升级到DTC,这会使这个问题消失

在此之前,我们所做的是开发我们的TransactionScope,我们的DAL然后会要求TS建立新连接,当我们处理TS时,它会关闭连接

连接存储在LogicalCallContext中,不过我会考虑改用HTTP上下文。我在应用程序上线之前离开了公司,但据我所知,他们没有任何问题

所以你应该

using (CustomTS.New())
{
 CustomerDal.Update()
 userDal.Update()
}

CustomTS有一个静态方法,可以获取当前事务和连接。

使用与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网页场景中,线程可以在连接和页面加载之间更改。线程也可以重复使用。但是,如果您正在开发一个在应用程序之间共享的DAL,您可能无法使用HttpContext,如前所述,因为没有。

好主意,因此如果我理解正确:在DAL方法中,我可以在TransactionScope.Current上确定。如果它不为null,则使用该事务以及与该事务关联的连接。如果它为null,则创建一个与我当前所做的相同的连接?在我给它一个大的滴答声之前,我必须尝试一下。基本上就是这样。您可以在Dal上更轻松一些…使用TansactionScope.Current.GetConnection()方法,它总是返回一个连接。我们拥有的类非常高级,希望我可以共享它,但它是封闭源代码的…TransactionScope是密封的,没有实现任何接口,所以我只能编写我自己的,而不是使用已经存在的-为什么?是的,你需要从头开始编写自己的…我很抱歉没有更清楚…我需要我们称之为TransactionContext是为了区别于TS。Sorry不要在asp.net应用程序中使用thread static,不要使用thread static…谷歌搜索原因(注释中没有足够的字符来解释)@Josh-这在某种程度上是正确的,请看我的答案。然而,有时DAL在应用程序之间共享,在Web服务情况下也有点不同。+1,Robert是对的。
[ThreadStatic]
不是邪恶的。当然,你可能不想为了以防万一而将其用于私有数据,但我不知道sqlconnection是如何私有的。即使它泄漏到另一个http请求,如果每个人都连接到同一个数据库,也没有安全风险。