JSP页面和mysql数据库连接在未知的时间段(约2天)后断开连接

时间:2017-01-21 18:16:12

标签: java mysql jsp tomcat

我正在研究JSP和MySQL。 在在线服务器(webfaction)上传我的项目后,它工作正常。但是,在一两天之后,页面丢失了与数据库的连接,所以当我尝试登录时,例如它没有连接到数据库,尽管JSP页面和Tomcat运行正常。

但是,当我重新启动Tomcat时,连接正常工作一两天,然后问题再次发生。

以下是连接类:

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

以下是与数据库通信的所有函数的(Model)类:

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>

在Webfaction服务器上上传的要求之一是JAVA类应该在JDK 6上编译,我这样做了。

你能帮助我为什么会这样吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

我对这种连接长时间停留感到非常满意。通常,您应该只在相当短的时间内保持连接打开,并在不使用时释放它。

话虽如此,有连接池 - 基本上与你在这里使用的技术相同:你抓住一个连接并在它启动时使用它。现在,当您使用池时,建议在重新使用之前检查连接,如果它不再存在则重新打开它。

回答你的问题,很可能是因为JSP方面的长时间沉默;如果您没有使用连接,服务器将关闭它。如果您想了解更多信息,请在MySQL端和MySQL驱动程序中启用详细日志记录,您将看到(1)究竟是什么关闭了连接,并且希望(2)为什么。