Tomcat + mod_jk 阻止其他 Apache 2 VirtualHost 应用程序的 mysql 连接

Tomcat + mod_jk 阻止其他 Apache 2 VirtualHost 应用程序的 mysql 连接

我负责以 webapps/ROOT 运行的旧版 Tomcat webapp。以前,该应用在专用 Linux 服务器上运行,但为了省钱,我被要求将其移至另一台 Linux 服务器,该服务器与一些 PHP 应用共享一个 MySQL 数据库。它们都使用 VirtualHosts 通过 Apache 2 提供。

自从迁移以来,Tomcat 应用程序似乎偶尔会“消耗”所有数据库连接,以至于 Tomcat 应用程序无法响应请求,但服务器上的 PHP 应用程序也不会响应请求。重新启动 Tomcat 即可解决该问题。

目前,我的解决办法是设置一个 cron 任务,每天晚上重新启动 Tomcat。这减少了此类事件的发生次数,但偶尔还是会发生。

在此应用中,数据库连接在 server.xml 中定义。我尝试修改 maxActive。最初,它设置为 99,但我将其更改为 -1,但似乎没有任何帮助。

<Resource name="jdbc/theApp" auth="Container"
          type="javax.sql.DataSource"
          username="tomcat"
          password="thePassword"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/theApp?autoReconnect=true"
          maxActive="-1"
          maxIdle="20"
          maxWait="3000"
          removeAbandoned="true"
          removeAbandonedTimeout="300"
          logAbandoned="true"/> 

问:有人见过这种情况吗?如果没有,有没有什么方法可以帮助诊断出了什么问题?原始开发团队无法联系。

答案1

我见过好几种情况,两个不同的应用程序最终争夺 mysql 连接池资源。大多数情况下,可以通过 mysql 调优来解决,但在某些情况下,这是应用程序的问题,需要解决。

查看 mysql cli 之类的内容显示进程列表命令将让您了解连接池正在做什么。我还会查看出色的 mysql 调优入门脚本,以了解 mysql 环境。它的跟踪如下: http://forge.mysql.com/projects/project.php?id=44

如果你真的只是想限制 tomcat 应用程序可能造成的损害,你可以将容器的最大连接数设置为小于最大连接数mysql 的变量。

相关内容