Dan*_*n M 6 c# entity-framework dbcontext entity-framework-core .net-core
我想在消耗处理率高卡夫卡队列,并利用.NET 2.1的核心我试图同时使用EF结果存储在MySQL的AddDbContext和AddDbContextPool我跑在这两种情况下进入的问题。
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,并将它们缓存。我仍然会配置允许重试的选项,但同样,这些超时将由于外部原因而发生,而不是因为我的代码正在创建数百个实例,这些实例都试图将小消息保存到数据库中。
我无法将范围设置为瞬态找不到语法!有吗?
不,显然是因为 DbContexts 的生命周期是由缓存控制的。
您收到的错误消息是由于从多个线程访问 DbContext 的同一实例引起的,因为 DbContext 类不是线程安全的。事实上,这意味着您的 DbContext 池无法正常工作,可能是因为您在使用消息队列中的消息时没有创建作用域,因此 DbContext 实例在多个线程之间共享。在 MVC 中,当 HTTP 请求到达时,该范围会在幕后创建,但在其他类型的应用程序中,您必须自己创建它。
请注意,DbContext 池和连接池之间也存在差异。如果您需要控制应用程序的连接数,则应该使用连接池。
如何解决这个问题呢?
我根本不会涉及上下文池,相反,我宁愿设置一些限制机制来控制队列中消耗的线程数量。
| 归档时间: |
|
| 查看次数: |
3298 次 |
| 最近记录: |