c# - 网络核心 DbContextPool 与 AddDbContextPool 等

标签 c# entity-framework .net-core entity-framework-core dbcontext

我正在尝试以高速处理使用 Kafka 队列,并使用 .net core 2.1 中的 EF 将结果存储在 MySql 中 我尝试同时使用 AddDbContextAddDbContextPool,但我在这两种情况下都遇到了问题。

1) 当使用 AddDbContext 时,我唯一成功的方法是将它限定为 transient ,这样每次我都会得到一个新的 DataContext 实例需要调用数据插入。我的队列很大,我最终与 mqSQL 服务器的连接太多,所以最终我开始收到大量超时错误。

我知道我可以添加选项来重试暂时性错误(超时就是其中之一),但我最感兴趣的是如何将 DataContext 实例的数量减少到不会影响数据库。这让我进行了下一次尝试

2) 使用 AddDbContextPool 时,我无法将作用域设置为 transient 找不到语法!有吗?无法为每次调用获取新实例,我遇到了另一种奇怪的错误,这些错误通常会在短暂的生命周期内解决

在配置时尝试使用上下文。 DbContext 实例不能在 OnConfiguring 内部使用,因为此时它仍在配置中。 如果在上一个操作完成之前在此上下文中启动第二个操作,就会发生这种情况。 不保证任何实例成员都是线程安全的。

另外据我了解,AddDbContextPool 中的 poolsize 参数只是为要重用的 DbContext 对象设置缓存大小,绝不会阻止总连接数.我希望当池饱和时能够阻止下一个“get DBContext”调用,直到一个实例可用。

所以我向社区提出的问题是如何解决这个问题?我很想将 DbContext 实例的数量减少到固定数量,例如10 并缓存它们。我仍然会配置允许重试的选项,但同样,这些超时将因外部原因而发生,而不是因为我的代码正在创建数百个实例,这些实例都试图将微小消息保存到数据库中。

最佳答案

I wasn't able to set the scope to transient couldn't find the syntax! Is there one?

不,很明显,因为 DbContext 的生命周期由缓存控制。

您收到的错误消息是由于从多个线程访问 DbContext 的同一实例引起的,因为 DbContext 类不是线程安全的。事实上,这意味着您的 DbContext 池无法正常工作,可能是因为您在使用消息队列中的消息时没有创建作用域,因此 DbContext 实例在多个线程之间共享。当 HTTP 请求到达时,此范围在 MVC 的掩护下创建,但在其他类型的应用程序中,您必须自己创建它。

请注意,DbContext 池和连接池之间也存在差异。如果您需要控制应用程序的连接数,则应使用连接池。

How to solve this problem?

我根本不会涉及上下文池,相反我宁愿设置一些节流机制来控制从队列中消耗的线程数量。

关于c# - 网络核心 DbContextPool 与 AddDbContextPool 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53567943/

相关文章:

c# - ComboBox - 如何防止下拉后选择项目

c# - LayoutKind.Sequential 当子结构具有 LayoutKind.Explicit 时未遵循

c# - 集合中集合的 Linq where 子句

android - 如何在 dotnet core 上实现服务器端 google 授权

c# - 使用 appsettings.json 配置 Serilog 以将某些日志过滤到不同的文件

c# - gRPC 保持响应流对订阅开放

C#:从泛型到值类型的转换

c# - 从 If 语句返回 Int

entity-framework - 为什么从dbContext获取ObjectContext的过程这么慢?

c# - SQL错误: connection string does not contain the required providerName attribute