mysql - Tomcat/MySQL/Java servlet 应用程序在几个小时不活动后出现 500 错误(使用 JNDI 连接池)

标签 mysql tomcat servlets

我编写了一个 Java Servlet/JSP 网络应用程序,它使用 MySQL 来保存登录身份验证。 Web 容器是 Tomcat 7.0.47,我使用 JNDI 连接池进行数据库连接。我已经仔细配置了 <Resource...>标记在我的 Tomcat 的 context.xml 中,并且在有大量事件的白天,应用程序的登录功能永远不会失败。但是经过一夜的休息后,第一次登录尝试经常会在浏览器中抛出 500 错误。在第二次和同一天的后续尝试中,登录成功。

我试过:

1:更新MySQL服务器到最新版本(运行在Windows Server 2008)

2:更新 mysql-connector-java-5.1.27-bin.jar(撰写本文时最新版本)

3:从构建路径中删除 mysql-connector-java-5.1.27-bin.jar 文件(因为我已经将其包含在 Tomcat lib 目录中)

4:添加了属性closeMethod = "close"到 Tomcat context.xml 中的标记

5:添加属性minIdle = "1"到 Tomcat context.xml 中的标记

6:我有removeAbandoned = "true"在context.xml中配置

7:将我所有的应用程序代码更改为 Java 7 的 try-with-resources 以保证关闭应用程序代码中的所有资源

(4、5 和 6 只是谷歌搜索后在黑暗中的刺痛,但它们没有用)

每天早上,我都是第一个登录我的应用程序的人:我收到 500,然后在当天剩下的时间里,一切都很好。我已经研究了几个星期了,但我没有想法!

最佳答案

尝试将以下两个属性添加到您的数据源配置中。

testOnBorrow="true"
validationQuery="SELECT 1"

第一个,testOnBorrow告诉数据源在将连接返回给应用程序之前验证连接。第二,validationQuery是用于验证连接的 SQL。注意SELECT 1的SQL是 MySQL 数据库的有效值。

这有望防止数据源将无效连接交还给应用程序。更新的<Resource>标记应如下所示:

<Resource name="jdbc/login" 
          auth="Container" 
          type="javax.sql.DataSource" 
          maxActive="100" 
          maxIdle="30" 
          minIdle = "1" 
          maxWait="10000" 
          removeAbandoned="true" 
          logAbandoned="true" 
          username="notRealUser" 
          password="notRealPassword" 
          driverClassName="com.mysql.jdbc.Driver" 
          url="jdbc:mysql://xxx.xxx.xxx.xxx:3306/login"
          testOnBorrow="true"
          validationQuery="SELECT 1"/>

关于mysql - Tomcat/MySQL/Java servlet 应用程序在几个小时不活动后出现 500 错误(使用 JNDI 连接池),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20848219/

相关文章:

php - mysql:存储任意数据

php - 从html到mysql数据库的基本输入

spring - ServletOutputStream 字节数组到 pdf 损坏的 pdf

mysql - 需要有关令人困惑的 MySQL 查询问题的帮助

eclipse - 无法在保存/热部署功能上进行编译以在 eclipse 或 netbeans 中使用基于 maven 的 webapp

apache mod_jk.so 启动权限被拒绝

java - 无法在 Tomcat 8.0.2 上的 Netbeans 中部署我的 Web 应用程序(出现以下错误)

java - 如何测试需要通过 HTTPServletRequest 的代码

java - 从 servlet 获取 html 到 ajax 是否正确?

mysql - 在 MySQL 中生成一个随机字符串