首页 新闻 会员 周边 捐助

如何看待EFCore2.0中的ContextPool(连接池)

0
悬赏园豆:50 [已解决问题] 解决于 2017-10-24 09:16

EF Core2.0中提供了链接池ContextPool功能。以此来优化初始化连接的效率。

现在有个疑问。链接池中的链接是被随机分配的。那么数据可能会被随机写到任意一台数据服务器中。此时就需要数据服务器之间做数据同步工作。这似乎是读写分离或者负载分压的解决方案,但是做读写分离或负载分压一般应该是“一主多从”的状态,可是从链接池中无法区分出主从状态。似乎无法满足普通的“一主多从”的设计

另外,我印象中(如果是错的请纠正),“一主多从”的读写分离策略一般是采用硬件或软件手段,让应用服务器可以从一个端口或者IP访问多个从服务器。也就是说,对于应用服务器来说,有一个读的地址就可以了。那我要地址池做什么?

刚接触服务集群等这方面的知识,望大神指点。

写代码的相声演员的主页 写代码的相声演员 | 小虾三级 | 园豆:517
提问于:2017-10-09 11:07
< >
分享
最佳答案
0

不太清楚ContextPool,仅就连接池说下,连接池的出现本身就是为了缓解建立连接认证的一系列开销,针对读写分离你可以在程序中显式指定使用某个连接池以达到目的,也可以使用aop或者直接拦截最底层的语句进行分离。

你说的从一个端口访问多个地址这个是用ha proxy等方式做的,这个和连接池关系不太大,这块建立db集群的方式很多,可以自行再搜索下。

收获园豆:50
Daniel Cai | 专家六级 |园豆:10424 | 2017-10-09 11:17

也就是说,如果采用代理的方式进行分压就没有必要连接池,或者说让连接池里仅有一个链接就好了,是这样么?

另外,如果想用连接池进行读写分离,就要用两个连接池一读一写,是吧?

 

写代码的相声演员 | 园豆:517 (小虾三级) | 2017-10-09 16:52

@写代码的相声演员: 连接池和你的读写分离两码事。就算你读写分离你也需要连接池的

Daniel Cai | 园豆:10424 (专家六级) | 2017-10-09 17:42

@Daniel Cai: 嗯,大概明白点了。

写代码的相声演员 | 园豆:517 (小虾三级) | 2017-10-09 20:26
其他回答(2)
0

链接池中的链接是被随机分配的。那么数据可能会被随机写到任意一台数据服务器中。

这个那么是怎么得出来的?

吴瑞祥 | 园豆:29449 (高人七级) | 2017-10-09 11:11

难道不是么?如果产生10个并发,链接池内有2个链接。这2个链接不是被随机分发给这10次并发么?

是不是我理解错了?请大神指正

支持(0) 反对(0) 写代码的相声演员 | 园豆:517 (小虾三级) | 2017-10-09 14:26

@写代码的相声演员: 数据可能会被随机写到任意一台数据服务器中

你并没有解释这个啊.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-10-09 15:01

@吴瑞祥: 因为10次并发的每次请求被分配到的链接地址是从连接池里随机分配的。所以每次亲求会被写入到分配的数据库中。也就是说可能10次并发,6次被写到了数据库A中,4次写到了数据库B中。

这么说可以么?

支持(0) 反对(0) 写代码的相声演员 | 园豆:517 (小虾三级) | 2017-10-09 16:47

@写代码的相声演员: 你配置了多个连接字符串吗?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-10-09 16:48

@吴瑞祥: 配置了2个

支持(0) 反对(0) 写代码的相声演员 | 园豆:517 (小虾三级) | 2017-10-09 17:27

@写代码的相声演员: 2个连接字符串确定系统能正常运行吗?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-10-09 17:35

@吴瑞祥: 神奇就神奇在这,改成连接池后,发布到linux虚拟机上不能正常运行了,但是在本地无论是直接Debug还是发布后通过命令行启动,都可以正常运行。

支持(0) 反对(0) 写代码的相声演员 | 园豆:517 (小虾三级) | 2017-10-09 20:27
0

我觉得题主只是搞混了 ContextPool的功能而已。

以此来优化初始化连接的效率。

这个的知识点在普通的单机开发中就有了,题主研究的东西太深了,所以不懂的这么简单的。

爱编程的大叔 | 园豆:30844 (高人七级) | 2017-10-09 11:53

嗯,是有点混乱,正确的ContextPool功能应该怎么理解,能麻烦简单的给解释一下么?谢谢

支持(0) 反对(0) 写代码的相声演员 | 园豆:517 (小虾三级) | 2017-10-09 16:48

@写代码的相声演员: 

For example, when working with SQL Server Compact, opening and closing the same connection is expensive. 

因为Open connection is expensive, ContextPool 是为了解决这个问题而已。

至于你的读写分离,负载均衡,与此无关。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2017-10-09 20:09

@爱编程的大叔: 

嗯,我看过文档了,说是链接池能节约频繁链接数据库时所造成的开销。

但是我刚才遇到一个问题,我做了一个WebApi。然后用另一个应用程序调用这个端口,进行一个10×100的并发测试,然后发现一个问题,他的运行效率比我直接把链接写在  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 中效率要低好多,这是为什么?

支持(0) 反对(0) 写代码的相声演员 | 园豆:517 (小虾三级) | 2017-10-09 20:25

@写代码的相声演员: 

第一,你這樣說不知道你怎麽測試的。

第二,你要對比的是有連接和沒有連接池的差別,而不是對比不同地方放連接串的差別。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2017-10-09 20:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册