JSP-страницы и разрывает соединения с базой данных MySQL после неизвестного периода времени (около 2 дней)

голоса
1

Я работаю на 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;
        } 
    }
}

И следующее это (модель) класс для всех функций для взаимодействия с базой данных:

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, и я так и сделал.

Можете ли вы помочь мне, почему это происходит?

Спасибо.

Задан 21/01/2017 в 16:16
пользователем
На других языках...                            


1 ответов

голоса
1

Я очень впечатлен тем, что соединение остается на так долго. Как правило, вы должны держать только соединение открытым в течение достаточно короткого промежутка времени, и отпустите ее, когда вы не используете его.

Сказав, что, есть пул соединений - в основном та же техника используется здесь: вы хватаете соединение и использовать его в то время как это до. Теперь, когда вы используете пулы, то целесообразно, чтобы проверить соединение перед повторным использованием и повторно открывать, если он нет в живых.

Отвечая на ваш вопрос, скорее всего, это из-за долгое молчание со стороны JSP; если вы не используете подключение, сервер не закроет его. Если вы хотели бы узнать больше, включить ведение подробного журнала на обеих сторонах MySQL и в драйверах MySQL, и вы увидите (1), что именно закрывает соединение, и, надеюсь, (2) почему.

Ответил 21/01/2017 в 16:23
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more