Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库访问在早上无法工作_Java_Mysql_Stripes - Fatal编程技术网

Java 数据库访问在早上无法工作

Java 数据库访问在早上无法工作,java,mysql,stripes,Java,Mysql,Stripes,我正在建立一个登录系统。当我在自己的电脑上测试时,它工作得非常好。一旦我把它上传到我们的服务器上,我们就开始遇到这样的问题。。。它不会在早上登录,只有几秒钟。剩下的时间都很好 我只是昨天和今天才遇到这个问题,每天早上只能测试一次,所以很难给出太多细节。以下是设置: 首页是一个使用javascript和js的html页面。它会显示一个空框架,然后对页面内容发出ajax请求。对于任何返回值为“访问权限不足”的失败ajax请求,它将取消隐藏持有登录表单的div。该登录表单清空页面并提供提交按钮。单击s

我正在建立一个登录系统。当我在自己的电脑上测试时,它工作得非常好。一旦我把它上传到我们的服务器上,我们就开始遇到这样的问题。。。它不会在早上登录,只有几秒钟。剩下的时间都很好

我只是昨天和今天才遇到这个问题,每天早上只能测试一次,所以很难给出太多细节。以下是设置:

首页是一个使用javascript和js的html页面。它会显示一个空框架,然后对页面内容发出ajax请求。对于任何返回值为“访问权限不足”的失败ajax请求,它将取消隐藏持有登录表单的
div
。该登录表单清空页面并提供提交按钮。单击submit按钮后,它会向Java服务器发送一个ajax登录请求。一旦该请求被返回,页面就会再次隐藏登录表单,一切照常进行

在后端,我们有一个java服务器运行在1.6和1.7之间(是的,我知道,我应该更清楚-服务器报告说它是1.7.001,但1.7功能(如基于字符串的switch case语句)不起作用,所以我们在上传时为1.6 java编译。这是我们正在处理的已知问题。)我们用条纹来做正面代码。数据库是一个mysql数据库,位于同一台服务器上

发生此错误时,它总是早上第一次登录。我加载页面,输入user/pass,然后单击login。页面闪烁并返回到登录屏幕。我还没有在登录后清除user/pass,因为我们仍处于测试阶段,所以我可以再次单击“login”,再单击十几次,直到它最终登录。这个问题只发生过两次:昨天和今天,早上第一次登录

我的同事在上一个项目的同一台服务器上的另一个类似设置中遇到了类似的问题。他说,他认为问题与sql server在java server没有意识到连接已关闭的情况下关闭连接有关,但他不确定,也不知道如何修复

我甚至不知道该提供什么其他信息,显示什么代码,或者诸如此类的东西。我在任何地方都能找到的最好的建议是“设置一个预定的事件,以确保每隔几个小时就有一个fire数据库请求”,但这似乎是如此。。。乱七八糟的。如果有人能帮我的话,我希望能够测试出一个更明确的问题和解决方案。如果有人能告诉我他们希望看到什么代码来解决这个问题,我很乐意把它粘贴起来。更多信息?问问吧。范围似乎如此。。。大的我不知道哪些片段可能是相关的

编辑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;
}

MySQL关闭已打开很长时间的连接,但不做任何事情。从你描述的情况来看,这就是你要面对的

第一次登录失败,因为它发现使用的数据库连接不再工作,并且驱动程序也注意到了这一点。然后,驱动程序将为下一个请求使用新连接

第一种处理这种情况的方法是检测这个SQLException,并通过使用相同的查询打开一个新连接来处理它。您正在使用的驱动程序中可能有其他可用的解决方案,但不幸的是,我不知道有任何解决方案

为了帮助检测此SQLException,您可以查看并评估此处列出的方法是否返回此错误特有的内容


如果您正在使用连接池,则可能包含保持连接活动的答案。

配置连接池以验证连接。然后,连接池将向数据库发送一个简单的查询(您在配置期间指定)。如果该查询失败,它将关闭连接并为您提供一个新的连接,否则它将就地使用它。这有助于解决这些问题,以及数据库在服务器后面崩溃的问题。

听起来像是某种超时问题。您在Java代码中使用什么驱动程序来连接MySQL?您是在使用单一连接进行所有查询,还是时不时地创建一个新的连接?可能相关吗?@wouther我认为您的第一印象是正确的。我打赌数据库至少在几个小时后关闭空闲连接。@wouth我包括了错误消息和连接代码。我正在为所有查询使用单个连接。是的,我认为DB会在几个小时后关闭空闲连接。我正在查看你的链接,我认为它很有用…@WolfmanJoe例外本身非常普遍,是的。您可以使用getMessage()、getErrorCode()和getSQLState()来查找用于检测此变量的标识信息。构建针对无限递归的保护也是一个好主意,例如在几次尝试后通过抛出异常放弃。还可以看到,在一次通话中,这种情况可能会发生多次。是否值得在对象上拥有一个“最后验证”的私有属性,并仅在半小时或一小时过去后验证连接?或者测试的成本是否足够小,以至于它并不重要?请注意,我可能会将此标记为答案,但我需要运行一些测试以确保它是答案。一旦我确定它工作正常(可能在下周发生),我会将其标记为正确。它只会在您从池中请求连接时验证连接。显然,如果在处理过程中连接出现问题,您将不得不处理该问题。您可以在代码中处理这些情况,也可以关闭连接并请求新的“新”连接。后者的作用更大