任何更新后 DbContext Dispose 都非常慢
DbContext Dispose is extremely slow after any Update
我已经更新了我的代码,以便在使用后通过 using
语句正确处理我所有的 EF6 DbContext
对象(根据在线社区中的几乎每个人的说法)。所以现在我可以准确地看到调用 dispose
.
需要多长时间
我发现 DBContext
会在几毫秒内消失,除非 DbContext
修改了一段内容,并且[= =15=] 对其执行的命令。当这种情况发生时(在任何内容上),处理大约需要 13 秒。
显然,我看不到 Dispose 命令在幕后实际做了什么,但它慢得离谱,我不确定如何继续。建议?
原来问题其实出在我额外的DBConfiguration的transactionHandler"CommitFailureHandler"。当我关闭故障处理程序时,一切都会恢复全速!原来__TransactionHistory
table已经长到很大了
我创建了一个 SQL 脚本来根据需要手动删除旧记录...
delete from [__TransactionHistory] where CreationTime < DATEADD(day, -2, getdate())
我确信有一种自动方法可以做到这一点,但对于我们的应用程序,它可以简单地手动完成,偶尔一次。
我们在 Azure SQL 数据库中遇到了同样的问题。我们根据 msdn Documentation over Handling of Transaction Commit Failures
配置您的 EntityFramework
检测到这个问题后,我们删除了这行代码,再次关闭此功能:
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
// SetTransactionHandler(SqlProviderServices.ProviderInvariantName, () => new CommitFailureHandler());
SetExecutionStrategy(SqlProviderServices.ProviderInvariantName, () => new SqlAzureExecutionStrategy());
}
}
基于 codeplex Documentation Handling of Transaction Commit Failures,您可以在应用程序启动时添加此代码以清理 __TransactionHistory table。
var commitFailureHandler = CommitFailureHandler.FromContext(context);
if (commitFailureHandler != null)
{
commitFailureHandler.ClearTransactionHistory();
}
我已经更新了我的代码,以便在使用后通过 using
语句正确处理我所有的 EF6 DbContext
对象(根据在线社区中的几乎每个人的说法)。所以现在我可以准确地看到调用 dispose
.
我发现 DBContext
会在几毫秒内消失,除非 DbContext
修改了一段内容,并且[= =15=] 对其执行的命令。当这种情况发生时(在任何内容上),处理大约需要 13 秒。
显然,我看不到 Dispose 命令在幕后实际做了什么,但它慢得离谱,我不确定如何继续。建议?
原来问题其实出在我额外的DBConfiguration的transactionHandler"CommitFailureHandler"。当我关闭故障处理程序时,一切都会恢复全速!原来__TransactionHistory
table已经长到很大了
我创建了一个 SQL 脚本来根据需要手动删除旧记录...
delete from [__TransactionHistory] where CreationTime < DATEADD(day, -2, getdate())
我确信有一种自动方法可以做到这一点,但对于我们的应用程序,它可以简单地手动完成,偶尔一次。
我们在 Azure SQL 数据库中遇到了同样的问题。我们根据 msdn Documentation over Handling of Transaction Commit Failures
配置您的 EntityFramework检测到这个问题后,我们删除了这行代码,再次关闭此功能:
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
// SetTransactionHandler(SqlProviderServices.ProviderInvariantName, () => new CommitFailureHandler());
SetExecutionStrategy(SqlProviderServices.ProviderInvariantName, () => new SqlAzureExecutionStrategy());
}
}
基于 codeplex Documentation Handling of Transaction Commit Failures,您可以在应用程序启动时添加此代码以清理 __TransactionHistory table。
var commitFailureHandler = CommitFailureHandler.FromContext(context);
if (commitFailureHandler != null)
{
commitFailureHandler.ClearTransactionHistory();
}