4

我正在开发一个基于 Java EE 的应用程序,使用 Tomcat 作为服务器和 MySQL 作为数据库。我已经为 50 个用户配置了连接池。

现在我的问题是,如果在给定时间有 51 个用户(同时)访问该应用程序,那么第 51 个用户会发生什么?(因为应用程序一次只支持 50 个连接)

我的要求是,对于第 51 个用户,我需要显示一条消息,例如“请在其他时间后访问”。

这可能吗?

4

4 回答 4

11

50 个连接池意味着您的 WebApp 到您的数据库的连接最多为 50 个,这并不意味着可以同时连接到您的应用程序的最大用户数。

即使很多用户同时使用您的应用程序,也并不意味着所有用户都将使用与 DB 的连接(例如,空闲、查看静态页面、从缓存中获取数据等)。

您没有提及您正在使用什么连接池,但我假设您正在使用任何体面的库并适当地使用它,例如每次完成查询时调用 connection.close() 以将连接返回到池。

如果是这种情况,请不要担心,如果池全部用完,则下一个用户将排队,直到一个连接返回池。

因此,您可以添加超时来检测此队列时间,例如,如果在 5 到 10 秒内 DriverManager.getConnection() 未返回,则假设池已满并将用户重定向到带有该消息的静态页面。

请务必记录此事件,因此如果您知道大部分时间池何时已满,那么是时候增加最大连接数了。

于 2012-06-13T09:56:14.947 回答
2

连接池本身由 Tomcat 管理,这使其对您的应用程序不可见。简而言之,您作为开发人员不知道也不应该关心它。

相反,您可以(并且应该)做的是确保您保持连接的时间不会超过您实际需要的时间。这样一来,您就不会让连接池一无所获。

至于你的问题?Tomcat 将第 51 个连接请求放入队列中,一旦有可用的连接请求,就会建立实际连接。

于 2012-06-13T09:42:19.580 回答
1

如果您的应用程序编写正确,您将检查池外的连接,仅将它们挂起足够长的时间以执行操作,然后立即将它们返回池以供其他人使用。

如果您这样做,您很可能能够通过 50 个连接为超过 50 个用户提供服务。

如果每个会话都挂在一个连接上,那么你就犯了一个错误。那永远无法扩展。

于 2012-06-13T09:37:37.480 回答
0

连接池通常包含最大连接配置参数,它指定与 db 的最大连接设置。一旦连接被释放,它就会返回到池中。在选择池的maxConnections时,您必须非常明智。这个数字必须是连接数,在正常用户流量场景下可以处理数据库连接需求。如果遇到这种情况,在大多数情况下,连接数超过了maxConnections,那么您必须增加此数量。就您而言,我认为您将能够轻松地同时为 50 多个用户提供服务。除此之外,它还取决于您的应用程序逻辑。它不能不必要地保持更长的连接时间,并且一旦完成连接就必须释放连接。

然而,一些连接池的实现,也允许连接池的大小在不同的时间,在应用程序的不同负载下变化。

于 2016-11-18T06:09:17.777 回答