我正在构建一个登录系统。当我只是在我自己的电脑上测试它时,它工作得非常好。一旦我将它上传到我们的服务器,我们就开始遇到问题......它在早上几秒钟内无法登录。其余时间工作正常。
我昨天和今天才遇到这个,每天早上只能测试一次,所以很难给出太多细节。这是设置:
首页是一个使用 javascript 和 angular js 的 html 页面。它会弹出一个空框架,然后对页面内容发出 ajax 请求。在任何返回值为“访问权限不足”的失败 ajax 请求上,它将取消隐藏div
持有登录表单。该登录表单将页面清空并提供一个提交按钮。单击提交按钮后,它会向 Java 服务器发送一个 ajax 登录请求。一旦该请求被返回,页面将再次隐藏登录表单,一切照常进行。
在后端,我们有一个运行在 1.6 和 1.7 之间的 Java 服务器(是的,我知道,我应该知道得更好 - 服务器报告它是 1.7.001,但是 1.7 的功能,如基于字符串的 switch-case 语句没有' t 工作,所以我们在上传时为 1.6 java 编译。这是我们正在处理的一个已知问题。)我们正在使用 Stripes 来做前端代码。该数据库是一个mysql数据库,位于同一台服务器上。
发生此错误时,总是早上第一次登录。我加载页面,输入用户/密码,然后单击登录。页面闪烁并返回登录屏幕。登录后我还没有清除用户/通行证,因为我们仍处于测试阶段,所以我可以再次点击“登录”,然后再点击十几次,最终登录。这个问题有只发生了两次:昨天和今天,早上的第一次登录。
我的同事在以前的项目(同一台服务器)上的另一个类似设置中遇到了类似的问题。他说他认为问题与 sql server 关闭连接而 java server 没有意识到连接已关闭有关,但他不确定,也不知道如何修复它。
我什至不知道要提供什么其他信息,要显示什么代码,或者类似的东西。我能在任何地方找到的最好的建议是“设置一个预定的事件以每隔几个小时发出一次可靠的数据库请求”,但这看起来很……笨拙。如果有人可以帮助我,我希望能够测试更明确的问题和解决方案。如果有人能告诉我他们希望看到什么代码来解决这个问题,我很乐意将其粘贴。更多信息?问一下。范围似乎如此……大……我不知道哪些部分可能是相关的。
编辑1:错误代码!
[ERROR] - Database Error 1 on verify
java.sql.SQLException: Already closed.
at org.apache.tomcat.dbcp.dbcp.PoolableConnection.close(PoolableConnection.java:114)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:191)
编辑 2:连接代码
这是来自我们专门为所有 mysql 数据库连接保留的对象。
private static ConnectionSource coreConnection = null;
private static DataSource coreDataSource = null;
public static ConnectionSource getCoreConnection() throws SQLException, NamingException {
if (coreConnection == null || !coreConnection.isOpen()) {
Context env = (Context)new InitialContext().lookup("java:comp/env");
coreDataSource = (DataSource)env.lookup("webapps/test");
coreConnection = new DataSourceConnectionSource(coreDataSource, new MysqlDatabaseType());
}
return coreConnection;
}