EF Core2.0中提供了链接池ContextPool功能。以此来优化初始化连接的效率。
现在有个疑问。链接池中的链接是被随机分配的。那么数据可能会被随机写到任意一台数据服务器中。此时就需要数据服务器之间做数据同步工作。这似乎是读写分离或者负载分压的解决方案,但是做读写分离或负载分压一般应该是“一主多从”的状态,可是从链接池中无法区分出主从状态。似乎无法满足普通的“一主多从”的设计
另外,我印象中(如果是错的请纠正),“一主多从”的读写分离策略一般是采用硬件或软件手段,让应用服务器可以从一个端口或者IP访问多个从服务器。也就是说,对于应用服务器来说,有一个读的地址就可以了。那我要地址池做什么?
刚接触服务集群等这方面的知识,望大神指点。
不太清楚ContextPool,仅就连接池说下,连接池的出现本身就是为了缓解建立连接认证的一系列开销,针对读写分离你可以在程序中显式指定使用某个连接池以达到目的,也可以使用aop或者直接拦截最底层的语句进行分离。
你说的从一个端口访问多个地址这个是用ha proxy等方式做的,这个和连接池关系不太大,这块建立db集群的方式很多,可以自行再搜索下。
也就是说,如果采用代理的方式进行分压就没有必要连接池,或者说让连接池里仅有一个链接就好了,是这样么?
另外,如果想用连接池进行读写分离,就要用两个连接池一读一写,是吧?
@写代码的相声演员: 连接池和你的读写分离两码事。就算你读写分离你也需要连接池的
@Daniel Cai: 嗯,大概明白点了。
链接池中的链接是被随机分配的。那么数据可能会被随机写到任意一台数据服务器中。
这个那么是怎么得出来的?
难道不是么?如果产生10个并发,链接池内有2个链接。这2个链接不是被随机分发给这10次并发么?
是不是我理解错了?请大神指正
@写代码的相声演员: 数据可能会被随机写到任意一台数据服务器中
你并没有解释这个啊.
@吴瑞祥: 因为10次并发的每次请求被分配到的链接地址是从连接池里随机分配的。所以每次亲求会被写入到分配的数据库中。也就是说可能10次并发,6次被写到了数据库A中,4次写到了数据库B中。
这么说可以么?
@写代码的相声演员: 你配置了多个连接字符串吗?
@吴瑞祥: 配置了2个
@写代码的相声演员: 2个连接字符串确定系统能正常运行吗?
@吴瑞祥: 神奇就神奇在这,改成连接池后,发布到linux虚拟机上不能正常运行了,但是在本地无论是直接Debug还是发布后通过命令行启动,都可以正常运行。
我觉得题主只是搞混了 ContextPool的功能而已。
以此来优化初始化连接的效率。
这个的知识点在普通的单机开发中就有了,题主研究的东西太深了,所以不懂的这么简单的。
嗯,是有点混乱,正确的ContextPool功能应该怎么理解,能麻烦简单的给解释一下么?谢谢
@写代码的相声演员:
For example, when working with SQL Server Compact, opening and closing the same connection is expensive.
因为Open connection is expensive, ContextPool 是为了解决这个问题而已。
至于你的读写分离,负载均衡,与此无关。
@爱编程的大叔:
嗯,我看过文档了,说是链接池能节约频繁链接数据库时所造成的开销。
但是我刚才遇到一个问题,我做了一个WebApi。然后用另一个应用程序调用这个端口,进行一个10×100的并发测试,然后发现一个问题,他的运行效率比我直接把链接写在 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 中效率要低好多,这是为什么?
@写代码的相声演员:
第一,你這樣說不知道你怎麽測試的。
第二,你要對比的是有連接和沒有連接池的差別,而不是對比不同地方放連接串的差別。