2017-01-21 8 views
1

私はJSPとMySQLで作業しています。 私のプロジェクトをオンラインサーバ(webfaction)にアップロードした後、正常に動作します。しかし、1日か2日後にページがデータベースとの接続が失われてしまったので、たとえばJSPページやTomcatが正常に動作していても、ログインしようとするとデータベースに接続しません。未知の期間(約2日後)のJSPページとmysqlデータベース接続の切断

ただし、Tomcatを再起動すると、接続は1〜2日間正常に動作し、問題は再び発生します。ここで

は、接続のためのクラスです:

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に準拠している必要があります。

これがなぜ起こるのか教えてください。

ありがとうございます。

答えて

1

接続が非常に長く続くことに非常に感銘を受けます。一般的には、接続を短時間だけ開いたままにし、使用しないときに解放しておく必要があります。

接続プーリングがあります。基本的には、ここで使用するのと同じテクニックです。接続を取得して使用中に使用します。今度はプールを使用するときは、接続が再使用される前に接続を確認して、もう使用していない場合は再オープンすることをお勧めします。

あなたの質問にお答えするには、おそらくJSP側からの長い沈黙のためです。接続を使用していない場合、サーバーは接続を閉じます。詳細を知りたい場合は、MySQL側とMySQLドライバの両方で詳細なログを有効にすると、(1)接続を正確に閉じるものと、うまくいけば、(2)理由がわかります。

+0

答えていただきありがとうございます。プール接続を使用する場合、ResultSet、PrepStat、およびConnを閉じる必要があります。そうしないと、dbとサーバーの間の接続が失われるdb接続にリークが発生します。しかし、私がResultSetとPrepStatを閉じた後にConnをタイプすることによってそれを適用しようとしたとき、私はエラーを受けました。上記のコードに基づいて接続をどのように閉じるべきかアドバイスできますか?ありがとう –

+0

私は、詳細、つまりコードと例外を取得している別の質問、または現在の質問の編集でなければならないと思います。私は細部がないと何が間違っているのか推測できません。通常、 '.close()'だけで接続を閉じます。接続がプールされている場合は、プールに切り替わります。私の最高の推測は、次回は接続を保存するのではなく、接続を再要求する必要があるということです(今は「閉じた」状態です)。 – alf

関連する問題