sharding-core icon indicating copy to clipboard operation
sharding-core copied to clipboard

实现iresetstateservice支持dbcontextpool

Open xuejmnet opened this issue 4 years ago • 18 comments

实现iresetstateservice支持dbcontextpool

xuejmnet avatar Oct 15 '21 07:10 xuejmnet

重置所有的dbcontext需要的话clear

xuejmnet avatar Oct 15 '21 07:10 xuejmnet

其他的dbcontext直接dispose

xuejmnet avatar Oct 19 '21 09:10 xuejmnet

啥时候支持啊?

pengweiqhca avatar Sep 09 '22 08:09 pengweiqhca

@pengweiqhca 你是一定要dbcontextpool吗,scope和transient大部分场景应该够了

xuejmnet avatar Sep 09 '22 08:09 xuejmnet

因为客户端分片会开启多个链接其实dbcontextpool没啥意义了

xuejmnet avatar Sep 09 '22 08:09 xuejmnet

不是必须,只是切换到sharding-core时报错了,然后发现没有支持且作为增强功能待实现,故问问

pengweiqhca avatar Sep 09 '22 08:09 pengweiqhca

@pengweiqhca 因为要实现iresetstateservice让其在分片后的dbcontext可以重置掉,但是之前看了代码没什么思路,然后用的人大部分都是scope或者是abp,abp是transient所以就渐渐淡忘了..

xuejmnet avatar Sep 09 '22 08:09 xuejmnet

@pengweiqhca 当然还有一个原因是没有什么必要,因为dbcontextpool是针对dbcontext的限制,而不是dbconnection,因为之前dbcontext和dbconnection的关系式一对一所以可以看成连接池,但是现在因为分片的原因dbcontext和dbconnection的关系式一对多了,所以就导致了dbcontextpool的设置毫无意义除了new dbcontext的次数变少了好像没有任何好处

xuejmnet avatar Sep 09 '22 09:09 xuejmnet

我覺得還是要實現dbcontextpool呢 因為在高併發的情況下,保留連線比不斷建立中斷的效能還要來的好。

另外希望您實現 PooledDbContextFactory,在 Worker Service的情境下,常常會有一個 class 下面多個 function 需要使用 dbcontext,如果 class 注入 dbcontext,所有 function 共用 dbcontext 會有幾個問題。

  1. 資料快取
  2. dbcontext 不支援多執行緒,會噴錯

ChengYen-Tang avatar Oct 07 '22 16:10 ChengYen-Tang

@ChengYen-Tang 可以实现,至于workservice下通过serviceprovider的createscope来使用会比较好

xuejmnet avatar Oct 07 '22 22:10 xuejmnet

我的方案都有切專案來解耦合。所以,操作DB的專案無法注入 serviceprovider

ChengYen-Tang avatar Oct 08 '22 06:10 ChengYen-Tang

@ChengYen-Tang 不应该所有用到依赖注入的地方都可以通过注入serviceprovider,是在不行就用静态的serviceprovider.Createscope

xuejmnet avatar Oct 08 '22 06:10 xuejmnet

我的意思是,您說將DBcontextFactory改用serviceprovider的地方,他在其它專案中,是沒辦法注入serviceprovider的。然後這個專案的某一層開始生命週期是 Singleton,所以被注入的元件只能依賴DBcontextFactory來create dbcontext

xuejmnet @.***> 於 2022年10月8日 週六 下午2:08 寫道:

@ChengYen-Tang https://github.com/ChengYen-Tang 不应该所有用到依赖注入的地方都可以通过注入serviceprovider,是在不行就用静态的serviceprovider.Createscope

— Reply to this email directly, view it on GitHub https://github.com/dotnetcore/sharding-core/issues/40#issuecomment-1272238777, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHYHHRUEWV2YPOWWNK7A4ATWCEFVHANCNFSM5GBKBR2A . You are receiving this because you were mentioned.Message ID: @.***>

ChengYen-Tang avatar Oct 08 '22 08:10 ChengYen-Tang

@ChengYen-Tang IServiceProvider的root节点也是Singleton的,所以能注入DBContextFatcory的地方IServicProvider都可以,所以我才说让你注入这个或者使用静态属性IServiceProvider

xuejmnet avatar Oct 08 '22 08:10 xuejmnet

使用DBContextFatcory的專案只要安裝EF套件就好,Iserviceprovider是worker service的專案才能使用,不然我就必須額外安裝DI套件,但是我不想讓資料庫的專案跟DI直接耦合

xuejmnet @.***> 於 2022年10月8日 週六 下午4:25 寫道:

@ChengYen-Tang https://github.com/ChengYen-Tang IServiceProvider的root节点也是Singleton的,所以能注入DBContextFatcory的地方IServicProvider都可以,所以我才说让你注入这个或者使用静态属性IServiceProvider

— Reply to this email directly, view it on GitHub https://github.com/dotnetcore/sharding-core/issues/40#issuecomment-1272264119, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHYHHRWMKN6GL6ZBJSSDOBLWCEVXBANCNFSM5GBKBR2A . You are receiving this because you were mentioned.Message ID: @.***>

ChengYen-Tang avatar Oct 08 '22 08:10 ChengYen-Tang

@ChengYen-Tang 但是efcore本身已经和Microsoft.Extensions.DependencyInjection.Abstractionslib已经耦合了,不需要在安装了,efcore本身就是依赖于IServiceProvider的不过没事我这边尽可能满足支持dbcontextpool

xuejmnet avatar Oct 08 '22 08:10 xuejmnet

@xuejmnet 這是我的情境啦!! 不過可能有些情境是開發成套件,不會希望物件要依賴於IServiceProvider,但是又想解決我一開始提到的兩點問題

https://github.com/dotnet/efcore/blob/767bc93c6e6fca19868f486c7df8f4235bcf53cd/src/EFCore/Infrastructure/PooledDbContextFactory.cs

ChengYen-Tang avatar Oct 08 '22 09:10 ChengYen-Tang

@ChengYen-Tang 可以实现,至于workservice下通过serviceprovider的createscope来使用会比较好

我覺得使用createscope不太好,我這邊的情境,程式剛啟動或爬資料時需要同步狀態,會密集的查詢,這樣導致密集觸發GC, image

ChengYen-Tang avatar Oct 20 '22 13:10 ChengYen-Tang