网络核心 DbContextPool 与 AddDbContextPool 等

Dan*_*n M 6 c# entity-framework dbcontext entity-framework-core .net-core

我想在消耗处理率高卡夫卡队列,并利用.NET 2.1的核心我试图同时使用EF结果存储在MySQL的AddDbContextAddDbContextPool我跑在这两种情况下进入的问题。

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

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

2)使用时AddDbContextPool我无法将范围设置为transient找不到语法!有吗?无法为每次调用都获得一个新实例我会遇到另一种奇怪的错误,这些错误通常可以通过短暂的生命周期解决

An attempt was made to use the context while it is being configured. A DbContext instance cannot be used inside OnConfiguring since it is still being configured at this point. This can happen if a second operation is started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

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

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

Jan*_*sky 2

我无法将范围设置为瞬态找不到语法!有吗?

不,显然是因为 DbContexts 的生命周期是由缓存控制的。

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

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

如何解决这个问题呢?

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