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

标签 java spring-boot jdbc microservices c3p0

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

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

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(...);

但是当我们想让数据源使用在不同的微服务中创建的连接池时,有没有例子/Github 可以得到它?

最佳答案

数据库连接本质上是引擎盖下的 TCP 连接,它由参与主机中的一对套接字唯一标识。这里的套接字是指网络地址(IP)和主机地址(端口)的组合。

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

有一些关于 TCP 连接迁移的研究,如 this one .但是,这里的主要目标不是性能(如在连接池中通过在连接建立期间节省 TCP 3 次握手的时间),而是允许现有连接继续并且不会因 IP 而中断由于移动性或故障转移而发生变化。

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

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

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

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

关于java - 在服务中构建连接池并在其他服务中使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54794513/

相关文章:

java - 如何使用 Java Observer 的 update(Observable, Object) 函数?

java - 如何使用 JPA native 查询选择具有相同名称的多个列?

sql-server - SQLServer 死锁

java - 如何让令人惊叹的 Hibernate 框架从其 session 中提供连接对象?

java - Java需要设置哪些环境变量?

java - GAE - 删除对象后列表不持久(DataNucleus 和 JDO)

java - Maven - 对于 Artifact ,版本不能为空

java - 如何在 Java 中将 MultiPartfile 提供给 Reader?

java - Intellij IDEA 中的 "Invalidate Caches"是否清除任何与构建相关的缓存?

java - 如何在 Spring Boot 中以 JSON 形式抛出异常