修改linq-to-sql命令文本时,是否应该关闭连接?

时间:2011-01-28 00:29:06

标签: linq-to-sql connection nolock

我正在修改linq-to-sql的命令文本以强制它使用nolock,就像这样......

if (db.Connection.State == System.Data.ConnectionState.Closed)
    db.Connection.Open();

var cmd = db.GetCommand(db.Customers.Where(p => p.ID == 1));

cmd.CommandText = cmd.CommandText.Replace("[Customers] AS [t0]", "[Customers] AS [t0] WITH (NOLOCK)");

var results = db.Translate(cmd.ExecuteReader());

它是一个MVC应用程序,因此datacontext位于基本控制器中,并且可能在此代码之前使用,更重要的是,之后使用。我应该在这个例程中关闭连接吗?还是一点都不?或者只有我在这里打开它?


更新:

我现在正在使用更通用的函数(在DataContext类中)来修改commandtext,并在此处打开它时关闭连接。 open已经下移到ExecuteReader。到目前为止,它一直在努力并减少零星的死锁问题。结果不一定是正确的。

    public List<T> GetWithNolock<T>(IQueryable<T> query)
    {
        // to skip nolock, just...
        // return query.ToList();

        List<T> results = null;

        bool opened = false;

        try
        {
            if (Connection.State == System.Data.ConnectionState.Closed)
            {
                Connection.Open();

                opened = true;
            }

            using (var cmd = GetCommand(query))
            {
                cmd.CommandText = Regex.Replace(cmd.CommandText, @"((from|inner join) \[dbo.*as \[t\d+\])", "$1 with (nolock)", RegexOptions.IgnoreCase);

                results = Translate<T>(cmd.ExecuteReader()).ToList();
            }
        }
        finally
        {
            if (opened && Connection.State == System.Data.ConnectionState.Open)
            {
                Connection.Close();
            }
        }

        return results;
    }

我在过去发现,以推荐的方式使用交易会导致网站在一夜之间耗尽连接。据我所知,这是linq-to-sql中的一个错误。可能有各种各样的方法,但我试图保持我的主要代码直截了当。我现在“只是”必须这样做......

var users = GetWithNolock<User>(
  Users
  .Where(u => my query
);

1 个答案:

答案 0 :(得分:0)

如果你打开它,你应该关闭它。其他LinqToSql操作符合此模式。

在我的代码中,我无条件地打开连接并最终关闭连接。如果有人通过我一个开放的连接,那就是他们的错,我碰巧为他们关闭了它。

您可以延迟打开连接,直到ExecuteReader。