代码之家  ›  专栏  ›  技术社区  ›  Frustrating Developments

连接管理ASP.NET

  •  3
  • Frustrating Developments  · 技术社区  · 16 年前

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

    我的理解告诉我“最好”的方法是打开一个连接,进行一个查询,关闭连接-并多次这样做,因为连接池会降低成本。

    当我有一个DAL时,问题就出现了,其中每个方法都处理自己的连接。例如。

    User x = DAL.GetUserDetails();
    Customer y = DAL.GetCustomer();
    

    在我们开始讨论TransactionScope之前,这是可以的

    using (TransactionScope t....
    {
    DAL.UpdateCustomer(y);
    DAL.UpdateUser(x);
    t.Complete();
    }
    

    ASP.NET现在想使用DTC,因为(我猜)涉及多个连接。

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

    我说得有道理吗?还是我错过了一些基本的东西?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Jason Plank Maksim Kondratyuk    13 年前

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

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

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

    所以你会

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

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

        2
  •  0
  •   Robert Wagner    16 年前

    在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网页方案中,线程可以在连接和页面加载之间更改。 See this article for more info .螺纹也可重复使用。但是,如果您正在开发一个在应用程序之间共享的DAL,那么您可能无法使用httpcontext,如前所述,因为没有。