dotnetcore / sharding-core

high performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵
https://xuejmnet.github.io/sharding-core-doc/
Apache License 2.0
1.17k stars 171 forks source link

实现iresetstateservice支持dbcontextpool #40

Open xuejmnet opened 3 years ago

xuejmnet commented 3 years ago

实现iresetstateservice支持dbcontextpool

xuejmnet commented 3 years ago

重置所有的dbcontext需要的话clear

xuejmnet commented 3 years ago

其他的dbcontext直接dispose

pengweiqhca commented 2 years ago

啥时候支持啊?

xuejmnet commented 2 years ago

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

xuejmnet commented 2 years ago

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

pengweiqhca commented 2 years ago

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

xuejmnet commented 2 years ago

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

xuejmnet commented 2 years ago

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

ChengYen-Tang commented 2 years ago

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

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

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

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

ChengYen-Tang commented 2 years ago

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

xuejmnet commented 2 years ago

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

ChengYen-Tang commented 2 years ago

我的意思是,您說將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: @.***>

xuejmnet commented 2 years ago

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

ChengYen-Tang commented 2 years ago

使用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: @.***>

xuejmnet commented 2 years ago

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

ChengYen-Tang commented 2 years ago

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

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

ChengYen-Tang commented 2 years ago

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

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

image