Java JSP页面和mysql数据库连接在未知时间段(约2天)后断开
我正在研究JSP和MySQL。 在将我的项目上传到在线服务器(webpartion)后,它工作正常。然而,一两天后,这些页面就失去了与数据库的连接,因此当我尝试登录(例如)时,它不会连接到数据库,尽管JSP页面和Tomcat运行良好 但是,当我重新启动Tomcat时,连接会正常工作一两天,然后问题再次发生 以下是用于连接的类:Java JSP页面和mysql数据库连接在未知时间段(约2天)后断开,java,mysql,jsp,tomcat,Java,Mysql,Jsp,Tomcat,我正在研究JSP和MySQL。 在将我的项目上传到在线服务器(webpartion)后,它工作正常。然而,一两天后,这些页面就失去了与数据库的连接,因此当我尝试登录(例如)时,它不会连接到数据库,尽管JSP页面和Tomcat运行良好 但是,当我重新启动Tomcat时,连接会正常工作一两天,然后问题再次发生 以下是用于连接的类: package Connect_DB; import java.sql.Connection; import java.sql.DriverManager; impor
package Connect_DB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbConnect {
public final static int delayPeriod = 500;
public final static String driverClassName = "com.mysql.jdbc.Driver";
public final static String mysqlUrl = "jdbc:mysql://localhost:3306/";
private static final String dbName = "mydatabase?characterEncoding=UTF-8";
private static final String dbUser = "root";
private static final String dbPassword = "";
private static Connection con = null;
public static Connection getConnection(String db, String user, String password) {
String dbUrl = mysqlUrl + db;
con = null;
try {
Class.forName(driverClassName);
con = DriverManager.getConnection(dbUrl, user, password);
} catch (Exception e) {
e.getMessage();
}
return con;
}
public static Connection getConnection() throws SQLException {
if(con == null){
return getConnection(dbName, dbUser, dbPassword);
}else{
return con;
}
}
}
以下是所有函数与数据库通信的(模型)类:
package Connect_DB.allghamees;
import java.sql.*;
import javax.naming.*;
import javax.sql.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SearchDb {
public Connection con;
public SearchDb(Connection con) {
this.con = con;
}
public boolean checkMobileAndPassword(String mobile, String pass) throws SQLException {
boolean ok = false;
ResultSet rs = null;
PreparedStatement queryEmaiPass= null;
try {
String sqlQuery = "SELECT mobile, password FROM users WHERE mobile = ? and password = ?";
queryEmaiPass = con.prepareStatement(sqlQuery);
queryEmaiPass.setString(1, mobile);
queryEmaiPass.setString(2, pass);
rs = queryEmaiPass.executeQuery();
while (rs.next()) {
ok = true;
}
rs.close();
queryEmaiPass.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return ok;
}
以下JSP页面示例用于在需要连接时调用上述类:
<%@page import="org.joda.time.DateTime"%>
<%@page import="java.util.ArrayList"%>
<%@page import="DB_Connect.allghamees.Activities"%>
<%@page import="DB_Connect.allghamees.Users"%>
<%@page import="DB_Connect.DbConnect"%>
<%@page import="DB_Connect.allghamees.SearchDb"%>
<%@page import="DB_Connect.allghamees.Validator1"%>
<%@page pageEncoding="UTF-8"%>
<jsp:include page="headPage.jsp"></jsp:include>
<title>Project 25</title>
</head>
<body>
<jsp:include page="header.jsp"></jsp:include>
<% request.setCharacterEncoding("UTF-8"); %>
<%
SearchDb db = new SearchDb(DbConnect.getConnection());
int typeId = 0;
String mobile = request.getParameter("mobile");
String pass = request.getParameter("pass");
boolean checkMobilePassword = false;
checkMobilePassword = db.checkMobileAndPassword(mobile, pass);
try {
if (!checkMobilePassword) {
session = request.getSession(true);
session.setAttribute("userLogin", 2);
response.sendRedirect("index.jsp");
}
}
catch (Exception ex) {
//out.close();
}
%>
</html>
项目25
在WebPosition服务器上上传的一个要求是JAVA类应该在JDK 6上遵守,我就是这么做的
你能告诉我为什么会这样吗
谢谢。我对连接保持这么长时间印象深刻。一般来说,您应该只在合理的短时间内保持连接打开,并在不使用时释放连接 话虽如此,这里有连接池——基本上与您在这里使用的技术相同:您获取一个连接,并在连接启动时使用它。现在,当您使用池时,建议在重新使用之前检查连接,如果连接不再活动,则重新打开连接
回答你的问题,很可能是由于JSP方面的长期沉默;如果您没有使用连接,服务器将关闭它。如果您想了解更多信息,请在MySQL端和MySQL驱动程序中启用详细的日志记录,您将看到(1)到底是什么关闭了连接,以及(2)为什么关闭连接。感谢您的回答,我了解到在使用池连接时应关闭ResultSet、PrepStat和Conn,否则,数据库连接将出现泄漏,导致数据库和服务器之间的连接丢失。然而,当我在关闭ResultSet和PrepStat之后通过键入close-the-Conn来尝试应用时,我得到了一个错误。你能告诉我如何根据上面给出的代码关闭连接吗?谢谢,我想这应该是一个包含全部细节的单独问题,即代码加上你得到的异常,或者是对当前问题的编辑。没有细节,我猜不出哪里不对。通常您只需通过
.close()
关闭连接即可;如果连接是池连接,它将转到池。我最好的猜测是,您下次需要重新请求连接,而不是保存它(因为它现在已“关闭”)