我编写了一个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,然后在一天的剩余时间里,一切都很好。我已经看了好几个星期了,但是我没有想法!
答案 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"/>