gpt4 book ai didi

java - 每个 http 请求的直接数据库连接与连接池 - 有什么区别

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:27 27 4
gpt4 key购买 nike

假设我正在存储 Person(id, country_id, name) 的数据。假设用户刚刚发送了 id 和 country_id,我们发回了名称。

现在我有一个数据库和 2 个网络服务器,每个网络服务器都有一个 20 个连接的连接池(例如 c3p0)。

这意味着数据库保持 40 个连接,每个网络服务器保持 20 个连接。

分析上面的系统我们可以看到我们使用了连接池,因为人们说“创建数据库连接很昂贵”

这一切都是有道理的


现在假设我在 country_id 上对表数据进行分片,那么现在可能有 200 db,同时假设我们的应用现在很流行,我们需要有 50 个网络服务器。
现在上面的连接池策略失败了,就好像每个网络服务器在池中为每个数据库保留 20 个连接。
这意味着每个网络服务器将有 20*200 db = 4000 个连接
每个数据库将有 50 个 Web 服务器 * 20 = 1000 个连接。

这听起来不太好,所以我想知道为什么要使用连接池,每个 Web 请求创建 1 个连接的开销是多少?

所以我运行了一个测试,我发现 DriverManager.getConnection() 在本地主机上平均需要 20 毫秒。

每个请求额外 20 毫秒不是游戏 killer

问题 1:每个 Web 请求使用 1 个连接还有其他缺点吗?

问题 2: 互联网上的人们都说“数据库连接很昂贵”。有哪些不同的费用?


PS:我也看到 pinterest 在做同样的事 https://medium.com/@Pinterest_Engineering/sharding-pinterest-how-we-scaled-our-mysql-fleet-3f341e96ca6f

最佳答案

除了连接创建和连接关闭周期是一项耗时的任务(即成本高昂)之外,还进行了池化以控制与数据库同时打开的连接数,因为数据库对同时连接数有限制服务器可以处理。当您这样做时,每个请求一个连接,您就失去了控制权,并且您的应用程序总是面临在峰值负载时崩溃的风险。

其次,您会不必要地将 Web 服务器容量与数据库容量联系起来,目标也是将数据库连接管理视为开发人员关注的问题,而不是基础设施问题。您是否愿意根据他/她的代码将控制权授予开发人员为生产应用程序打开数据库连接?

在 Weblogic、JBoss、WebSphere 等传统单体应用服务器中,其系统管理员将根据数据库服务器容量创建连接池,并将 JNDI 名称传递给开发人员使用。开发人员的工作是仅使用它获取连接JNDI。

接下来是如果数据库在各种独立的应用程序之间共享,那么池化让您知道您正在向哪个应用程序提供什么。一些应用程序的数据密集度可能更高,而有些应用程序可能不那么密集。

资源泄漏的传统问题,即当开发人员忘记干净地关闭他们的连接时,也可以通过池来解决。

总而言之 - 池背后的想法是让开发人员只关心使用连接和完成他们的工作,而不用担心打开和关闭它。如果一个连接在 X 分钟内没有被使用,它将根据配置返回到池中。

关于java - 每个 http 请求的直接数据库连接与连接池 - 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44405794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com