在一个服务中构建连接池并在其他服务中使用它们

Ank*_*Roy 2 java jdbc c3p0 spring-boot microservices

在使用 Spring-Boot 和 Eureka 服务发现构建的微服务架构中,我正在为单独的单个服务中的许多应用程序构建 C3P0 连接池。但是,当我尝试将创建的连接池作为对象返回到各自的应用程序并使用该对象的连接时,它不起作用。

例如 - 当我们使用 C3P0 直接创建 DataSource 时,我们编写 -

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(...);
Run Code Online (Sandbox Code Playgroud)

但是,当我们希望数据源使用在不同微服务中创建的连接池时,是否有任何示例/Github 可以获取它?

Sap*_*asu 5

DB 连接本质上是底层的 TCP 连接,由参与主机中的一对套接字唯一标识。这里的套接字意味着网络地址(IP)和主机地址(端口)的组合。

当建立 TCP 连接时,所有这些详细信息都存储在称为 TCB 的数据结构中的任一端点上。因此,您不能只是将 TCP 连接从一台主机迁移到另一台主机。

像这样的TCP 连接迁移研究已经有一些了。然而,这里的主要目标不是性能(如在连接池中,通过在连接建立期间节省 TCP 3 次握手的时间),而是允许现有连接继续,并且不会由于移动或故障转移而导致 IP 更改而中断。

如果您参考上面的链接论文,核心概念是再次进行 3 次握手以创建与新 IP 的新连接。唯一的区别是,在握手期间,将传递一些额外的控制数据,以使用新的主机数据更新 TCB,以便正在进行的数据传输可以继续进行,而不会因 IP 更改而中断。

因此,您不能仅将数据库连接从一台主机转移到另一台主机,因为这些主机具有不同的 IP。我链接的上述论文是草稿版本。即使它被实现,它也不会帮助你的事业,因为正如我所说,迁移将再次需要握手,这是你在连接池中想要避免的。

如果您以某种方式将数据源从一台主机传输到另一台主机,然后尝试从中借用连接,则数据源在返回连接之前执行的连接测试将失败,并且这将持续到所有连接都耗尽然后新连接为止将针对该特定主机创建。所以,最终你不会从中得到任何东西。

最后,将所有连接池托管在单个微服务中的想法(尽管由于上述事实本质上是错误的)似乎与基于微服务的架构背道而驰。这会造成瓶颈,该微服务的任何问题都会导致整个基础设施瘫痪。在微服务架构中,我们希望将问题本地化而不是扩散。您的各个微服务应该尽可能地自治,而像舱壁和断路器这样的模式对于实现这一点大有帮助。