java - 来自多个 servlet 的远程数据库连接池

标签 java mysql database servlets connection-pooling

这是一个由多个部分组成的问题,所以请耐心等待。

我正在使用 java servlet 开发一个基于 Web 的应用程序。将有多个应用服务器来平衡系统的负载。这些服务器访问中央远程数据库(它们都不位于 LAN 中)来执行请求。系统的要求之一是能够向网络动态添加新的应用程序服务器,并使其能够连接到数据库并立即开始处理请求。

我的问题:

  • 要设置远程 MySQL 数据库服务器,我需要修改一些配置文件以允许外部连接。这些文件是哪些文件以及如何为新添加的服务器动态修改它们,这些服务器的 IP 地址在实际启动之前是未知的?
  • 对于远程数据库访问,我应该使用连接池吗?连接池是否会为每个 servlet 单独完成?对于新添加的服务器(更多请求),池将如何扩展?
  • 对应用程序服务器的每个请求都会经过多个单独的数据库调用(例如:查找和更新)。我应该在这些操作中使用相同的连接还是每次都释放它?

谢谢

最佳答案

我对MySQL不太了解,所以我不会回答第一部分。

但是,是的,您绝对应该使用连接池。远程数据库的连接设置时间比附近数据库的连接设置时间更短,因此重用连接更为重要。

池可以根据您的喜好进行配置,但通常是针对每个服务器的,因此它们将由给定服务器中的所有 servlet 共享。如果为池配置最大大小,则数据库的连接总数将与服务器数量成正比。这是需要小心的事情 - 我已经看到数据库由于大量客户端中的池大小不适当而下降了几次。

是的,您应该在每个请求的持续时间内重复使用单个连接(可能)。对于初学者来说,如果您想在整个请求中使用单个事务,则必须执行此操作(几乎肯定会这样做)。除此之外,获取和释放连接并不是免费的,因此重用连接会分摊多个操作的成本。

一个警告:在请求的生命周期中保留连接可能会增加每个操作的抓取和释放所需的池大小。通常,这是一个很好的权衡。但如果您受到连接数量的严重限制,则可能并非如此。这在某种程度上取决于请求持续的时间以及它们执行的数据库工作量,较短、较繁忙的请求可以更好地利用重用的连接。如果您正在提供无需引用数据库即可生成的巨大媒体流,则您的应用程序可能不适合此模式。

最后一点:如果您的数据库距离很远,您将比平常从缓存中受益更多。仔细检查是否有数据可以有效地缓存,甚至可以存储在每台服务器的本地数据库中,以避免访问中央数据库。

关于java - 来自多个 servlet 的远程数据库连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9472786/

相关文章:

sql - 使用和不使用连接的查询性能

java - 嵌入模式下的 h2 并发更新

database - 如何在不中断报表的情况下重命名 Tableau 数据源中的列?

用于提取数据的 Java 正则表达式模式

mysql - 我能否获得行的 SUM() 的第二大值(使用 COUNT())?

mysql - 不区分大小写的mysql替换

MySQL 查询要过滤的多列?

java - 插入Access数据库

java - 在 Ignite 中使用 Map 作为缓存键的错误

java - 不一致的 java 和 sql 对象类型