我编写了一个 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/