Tomcat / MySQL / Java servlet应用程序在几小时不活动后获得5​​00错误(使用JNDI连接池)

时间:2013-12-30 21:55:45

标签: mysql tomcat servlets

我编写了一个Java Servlet / JSP Web应用程序,它使用MySQL来保存登录身份验证。 Web容器是Tomcat 7.0.47,我正在使用JNDI连接池来实现数据库连接。我已经在我的Tomcat的context.xml中仔细配置了<Resource...>标签,并且在有大量活动的那天,应用程序的登录功能永远不会失败。但是在隔夜休息之后,第一次登录尝试经常会在浏览器中抛出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:在Tomcat context.xml

中为标记添加了属性closeMethod = "close"

5:在Tomcat context.xml

中为标记添加了属性minIdle = "1"

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

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

(4,5和6只是在黑暗中真正的谷歌搜索后,他们没有工作)

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

1 个答案:

答案 0 :(得分:0)

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

testOnBorrow="true"
validationQuery="SELECT 1"

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

这应该有希望阻止数据源将dud连接交还给应用程序。更新的<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"/>