- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我正在存储 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/
最近,我们将专用 SQL 池部署到生产中的 Synapse 工作区。在开发中,我们可以访问无服务器 SQL 池和专用 SQL 池。但是,在生产中,我们可以访问无服务器 SQL 池,但无法访问专用 SQ
假设您从一个项目公开 WCF 服务,并使用“添加服务引用”(在本例中为 Framework 3.5 WPF 应用程序)在另一个项目中使用它。 当您重新实例化 ClientBase 派生代理时,Clie
我有一个函数,它使用 multiprocessing.Pool 并行处理一个数据集中的所有数据。 from multiprocessing import Pool ... def func():
我正在尝试使用进程对象在 python 中使用工作池。每个 worker (一个进程)进行一些初始化(花费大量时间),传递一系列作业(理想情况下使用 map()),并返回一些东西。除此之外,不需要任何
我是软件工程师,最近我构建了我的 Linux 机器,想探索更多系统管理员类型的任务。我已经探索并阅读了很多关于 ZFS 的内容,但我越来越困惑,因为每篇文章对它的描述都不一样。 Everything
我有 zfs 池: $ sudo zpool status lxd pool: lxd state: ONLINE scan: none requested config: NAME
我有一个基于 Actor 的项目,对于其中的一部分,我必须使用一些接收消息的 Actor ,然后一个 Actor 分别分配给每个请求,每个 Actor 负责执行其消息请求,所以我需要类似线程的东西我的
我已经使用 QEMU 模拟器成功地将 FreeBSD 安装到原始图像文件中。我已经使用 ZFS 文件系统 (ZFS POOL) 格式化了图像文件。 使用下面的命令我已经成功地挂载了准备好由 zpool
我正在使用 multiprocessor.Pool并行处理一些文件。该代码等待接收文件,然后使用 Pool.apply_async 将该文件发送给工作人员。 ,然后处理文件。 这段代码应该一直在运行,
我正在使用带有光滑的 Bonecp 数据源。并发现池包含关闭的连接所以我总是遇到这个异常 java.sql.SQLException: Connection is closed! at com
我有apartment gem的 Multi-Tenancy Rails应用程序,我可以使用apartment-sidekiq在每个工作程序中成功切换数据库租户。但是,sidekiq worker 正
ZFS 池可能由数据集(文件系统、快照等)或卷组成。 ZFS 卷就像 block 设备,但我不明白池和文件系统之间的区别。当我通过 zpool create pool1 sda sdb sdc 创建
我在 docker 容器上运行了 airflow。我正在使用 airflow 2.0.2 版。 我知道我实际上可以通过 UI 创建池。但我正在寻找一种通过 pools.json 文件在 docker
我在tomcat中有一个jdbc池,用于建立数据库连接。我在使用后没有显式关闭连接对象。我的“maxActive”参数设置为100。应用程序运行了一段时间,但随后失败进行数据库查询。它会等待无限时间来
阅读 PostgreSQL 文档 here我读了以下内容: As well, connections requested for users other than the default config
我在 docker 容器上运行了 airflow。我正在使用 airflow 2.0.2 版。 我知道我实际上可以通过 UI 创建池。但我正在寻找一种通过 pools.json 文件在 docker
我正在读取一个大的 URL 文件并向服务发出请求。该请求由返回 ListenableFuture 的客户端执行。现在我想保留一个 ListenableFuture 池,例如最多同时执行 N 个 Fut
我想使用队列来保存结果,因为我希望消费者(串行而不是并行)在工作人员产生结果时处理工作人员的结果。 现在,我想知道为什么以下程序挂起。 import multiprocessing as mp imp
我正在开发一个单页应用程序,目前正在构建一个 JQuery、ajax 函数,以便我的所有调用都能通过。 对于一个典型的页面,我可能有 3 个 ajax 调用。我的想法是,如果用户互联网出去将这些 aj
我有一个单位类及其一些子类(弓箭手、剑客等)。我怎样才能创建一个回收所有单元类型子类的池? 最佳答案 这是不可能的,因为池只能包含一种特定类型的对象。否则你可能会遇到这样的情况: Pool unitP
我是一名优秀的程序员,十分优秀!