Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在服务中构建连接池并在其他服务中使用它们_Java_Spring Boot_Jdbc_Microservices_C3p0 - Fatal编程技术网

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

Java 在服务中构建连接池并在其他服务中使用它们,java,spring-boot,jdbc,microservices,c3p0,Java,Spring Boot,Jdbc,Microservices,C3p0,在使用Spring Boot和Eureka service discovery构建的微服务体系结构中,我正在一个单独的服务中为许多应用程序构建C3P0连接池。 但是,当我试图将创建的连接池作为对象返回给它们各自的应用程序并使用来自该对象的连接时,它不起作用 比如说- 当我们使用C3P0直接创建数据源时,我们编写- ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(..

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

比如说- 当我们使用C3P0直接创建数据源时,我们编写-

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

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

不可能在服务之间传递填充的连接池,因为它们需要活动并从该Java应用程序的地址空间加载类,物理连接也需要来自Java应用程序。你需要以不同的方式解决这个问题

可以在服务之间传递配置的数据源。这将从本质上序列化或外部化数据源配置,并使用相同的配置构建一个新配置。请注意,并非所有数据源实现都支持这一点


这在Java中已经存在多年,例如,JNDI服务器如何用于查找分布式应用程序的配置数据,或者JavaEE应用程序如何与Java客户端应用程序共享配置数据。根据我的经验,这种做法越来越不常见,越来越倾向于使用Spring Cloud Config等工具。

不可能在服务之间传递已填充的连接池,因为它们需要从Java应用程序的地址空间激活和加载类,物理连接也需要来自Java应用程序。你需要以不同的方式解决这个问题

可以在服务之间传递配置的数据源。这将从本质上序列化或外部化数据源配置,并使用相同的配置构建一个新配置。请注意,并非所有数据源实现都支持这一点


这在Java中已经存在多年,例如,JNDI服务器如何用于查找分布式应用程序的配置数据,或者JavaEE应用程序如何与Java客户端应用程序共享配置数据。根据我的经验,这种做法越来越不常见,越来越倾向于使用Spring Cloud Config等工具。

DB连接本质上是一种隐蔽的TCP连接,由参与主机中的一对套接字唯一标识。这里,套接字表示网络地址IP和主机地址端口的组合

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

有一些关于TCP连接迁移的研究,如。但是,这里的主要目标不是通过在连接建立期间节省TCP三方握手时间来实现连接池中的性能,而是允许现有连接继续,而不是由于移动性或故障切换而导致IP更改而中断

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

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

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


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

DB连接本质上是一个在引擎盖下的TCP连接,这是唯一的 由参与主机中的一对套接字标识。这里,套接字表示网络地址IP和主机地址端口的组合

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

有一些关于TCP连接迁移的研究,如。但是,这里的主要目标不是通过在连接建立期间节省TCP三方握手时间来实现连接池中的性能,而是允许现有连接继续,而不是由于移动性或故障切换而导致IP更改而中断

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

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

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


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

您要通过http将数据库连接池从一个微服务传递到另一个微服务吗?这是行不通的。每个微服务都应该有自己的连接池,这就是它的工作方式。您可以在微服务之间传递一些可序列化的数据源配置,以确保它们都使用相同的用户连接到相同的数据库,但每个微服务都有自己的连接池。非常感谢!这正是我想要证实的,伊万。解决方法是什么?有两种选择:使用一个数据源的单片应用程序或在服务之间传递一些配置对象。该对象将包含驱动程序名、数据库url、用户名、密码,每个服务将基于该配置对象创建自己的数据源池;我的应用程序结构不是单一的,让我来分析另一个选项。你打算通过http将数据库连接池从一个微服务传递到另一个微服务吗?这是行不通的。每个微服务都应该有自己的连接池,这就是它的工作方式。您可以在微服务之间传递一些可序列化的数据源配置,以确保它们都使用相同的用户连接到相同的数据库,但每个微服务都有自己的连接池。非常感谢!这正是我想要证实的,伊万。解决方法是什么?有两种选择:使用一个数据源的单片应用程序或在服务之间传递一些配置对象。该对象将包含驱动程序名、数据库url、用户名、密码,每个服务将基于该配置对象创建自己的数据源池;我的应用程序结构不是单一的,让我分析另一个选项。谢谢马克。在这种情况下,Spring云配置是如何实现的?我的意思是,这个配置是否提供了其他非传统的解决方案,但解决了这个问题?如果您可以详细说明,请帮助我。@AnkurB.Roy-Spring-cloud-config只提供配置,消费服务本身需要应用该配置,而JNDI可以包含实际配置的Java对象,这些对象可以在服务之间序列化,也可以是某种形式的元数据对象。不同之处在于耦合量和复杂性。您正在尝试的是不可能的,并且只会导致JNDI的一个糟糕的变体,而在我看来,像Spring Cloud Config这样的东西在这种情况下更简单。谢谢Mark。在这种情况下,Spring云配置是如何实现的?我的意思是,这个配置是否提供了其他非传统的解决方案,但解决了这个问题?如果你也能详细说明的话,请帮我。@AnkurB.Roy Spring cloud config只提供配置和消费服务
vice将需要应用它本身,而JNDI可以包含实际配置的Java对象,这些对象可以在服务之间序列化,也可以是某种形式的元数据对象。不同之处在于耦合量和复杂性。您正在尝试的是不可能的,并且只会导致JNDI的一个糟糕的变体,而在我看来,像Spring Cloud Config这样的东西在这种情况下更简单。我理解。谢谢你的深入解释,我明白了。感谢您的深入解释。