C# 需要运行迁移控制台应用程序:记录杀死过程太多-不知道如何解决

C# 需要运行迁移控制台应用程序:记录杀死过程太多-不知道如何解决,c#,sql,nhibernate,transactions,unit-of-work,C#,Sql,Nhibernate,Transactions,Unit Of Work,我已经编写了一些代码来为一个全面的事务处理数据。然而,我正遭受着无尽的问题和死胡同。如果我在一个小数据集上运行我的代码,它将按预期工作。但是现在我已经将生产环境恢复到测试数据库中,以获得完整的测试范围。我基本上是在浪费时间 private static void AddProvisionsForEachSupplement2(ISupplementCoordinator supplmentCord) { var time = DateTime.Now;

我已经编写了一些代码来为一个全面的事务处理数据。然而,我正遭受着无尽的问题和死胡同。如果我在一个小数据集上运行我的代码,它将按预期工作。但是现在我已经将生产环境恢复到测试数据库中,以获得完整的测试范围。我基本上是在浪费时间

private static void AddProvisionsForEachSupplement2(ISupplementCoordinator supplmentCord)
    {


        var time = DateTime.Now;
        using (var scope = new UnitOfWorkScope())
        {
            var supplements = supplmentCord.GetContracts(x => x.EffectiveDate <= new DateTime(2014, 2, 27)).AsEnumerable();

            foreach (var supplement in supplements){

                    var specialProvisionTable = supplement.TrackedTables.FirstOrDefault(x => x.Name == "SpecialProvisions");


                    SetDefaultSpecialProvisions(specialProvisionTable, supplement);


                    Console.Out.WriteLine(supplement.Id.ToString() + ": " + (DateTime.Now - time).TotalSeconds);

            }

        }
    }

在获得事务超时之前,我添加了[Transaction(Timeout=6000)]以获得该信息。

我们需要更多信息,给您一个明确的答案将非常困难。然而,当在一个大型事务中处理大型数据集时,总是会影响性能

然而,坦白说,我要做的第一件事就是连接一个SQL分析器(比如,或SQL分析器,甚至)来查看您发出了多少查询。然后,当您进行测试时,您可以看到是否可以减少查询,从而减少时间

在解决了这个问题后,您有几个选择:-

  • 使用无状态会话获取数据,但这会删除更改跟踪,因此您需要在以后手动将其持久化
  • 将单个大事务减少为较小的事务(这是我将从开始的内容)
  • 看看在一次点击中加载大量数据是否更有效
  • 看看使用是否对你有帮助
  • 不要放弃,战斗并理解为什么这会给你带来问题,这是成为NHibernate的主人(而不是奴隶)的关键


    祝你好运:)

    谢谢里波,我想说得简洁一些。我将添加更多信息,不过我会将其作为中等范围的6位数查询。如果不重写“dev complete”(开发完成)项目的整个后端,我真的无法将其缩减,这是为了追溯数据库更新。这需要一篇硕士论文来证明这个项目中有多少垃圾,所以我希望指出WAAAY太大和事务超时会导致相同的答案,如果是100k查询或600k查询。
    The transaction associated with the current connection has completed but has not been disposed.  The transaction must be disposed before the connection can be used to execute SQL statements.