我正在开发一个基于 Java EE 的应用程序,使用 Tomcat 作为服务器和 MySQL 作为数据库。我已经为 50 个用户配置了连接池。
现在我的问题是,如果在给定时间有 51 个用户(同时)访问该应用程序,那么第 51 个用户会发生什么?(因为应用程序一次只支持 50 个连接)
我的要求是,对于第 51 个用户,我需要显示一条消息,例如“请在其他时间后访问”。
这可能吗?
我正在开发一个基于 Java EE 的应用程序,使用 Tomcat 作为服务器和 MySQL 作为数据库。我已经为 50 个用户配置了连接池。
现在我的问题是,如果在给定时间有 51 个用户(同时)访问该应用程序,那么第 51 个用户会发生什么?(因为应用程序一次只支持 50 个连接)
我的要求是,对于第 51 个用户,我需要显示一条消息,例如“请在其他时间后访问”。
这可能吗?
50 个连接池意味着您的 WebApp 到您的数据库的连接最多为 50 个,这并不意味着可以同时连接到您的应用程序的最大用户数。
即使很多用户同时使用您的应用程序,也并不意味着所有用户都将使用与 DB 的连接(例如,空闲、查看静态页面、从缓存中获取数据等)。
您没有提及您正在使用什么连接池,但我假设您正在使用任何体面的库并适当地使用它,例如每次完成查询时调用 connection.close() 以将连接返回到池。
如果是这种情况,请不要担心,如果池全部用完,则下一个用户将排队,直到一个连接返回池。
因此,您可以添加超时来检测此队列时间,例如,如果在 5 到 10 秒内 DriverManager.getConnection() 未返回,则假设池已满并将用户重定向到带有该消息的静态页面。
请务必记录此事件,因此如果您知道大部分时间池何时已满,那么是时候增加最大连接数了。
连接池本身由 Tomcat 管理,这使其对您的应用程序不可见。简而言之,您作为开发人员不知道也不应该关心它。
相反,您可以(并且应该)做的是确保您保持连接的时间不会超过您实际需要的时间。这样一来,您就不会让连接池一无所获。
至于你的问题?Tomcat 将第 51 个连接请求放入队列中,一旦有可用的连接请求,就会建立实际连接。
如果您的应用程序编写正确,您将检查池外的连接,仅将它们挂起足够长的时间以执行操作,然后立即将它们返回池以供其他人使用。
如果您这样做,您很可能能够通过 50 个连接为超过 50 个用户提供服务。
如果每个会话都挂在一个连接上,那么你就犯了一个错误。那永远无法扩展。
连接池通常包含最大连接配置参数,它指定与 db 的最大连接设置。一旦连接被释放,它就会返回到池中。在选择池的maxConnections时,您必须非常明智。这个数字必须是连接数,在正常用户流量场景下可以处理数据库连接需求。如果遇到这种情况,在大多数情况下,连接数超过了maxConnections,那么您必须增加此数量。就您而言,我认为您将能够轻松地同时为 50 多个用户提供服务。除此之外,它还取决于您的应用程序逻辑。它不能不必要地保持更长的连接时间,并且一旦完成连接就必须释放连接。
然而,一些连接池的实现,也允许连接池的大小在不同的时间,在应用程序的不同负载下变化。