2015-04-16 6 views
0

Я использую драйвер типа 4 для mysql. Код приведен ниже. В каждом java-файле я создаю db-соединение и закрываю его в конце. Напримерmysql db соединение с java

В abc.java

Dbconnection db=null; 
Connection con=null; 
PreparedStatement pstmt = null; 
public ActionForward execute(----) 
    { 
try{ 
    db=new Dbconnection();//instantiating user defined Dbconnection class object 
    con=db.getConnection();//creating connection object 
    ........... 
    Login_Check formBean=(Login_Check)form;//bean class object 

    pstmt=con.prepareStatement("select type from user_registration where user_name=? and password=? and user_status=?"); 
    //form parameter values 
    pstmt.setString(1,formBean.getUname().trim()); 
    pstmt.setString(2,formBean.getPassword().trim()); 
    pstmt.setString(3,"Active");//user status should be active 

    ResultSet rs=pstmt.executeQuery(); 

     if(rs.next()) 
     { 
      ................ 
      db.releasePreparedStatement(pstmt); 
      db.releaseConnection(con); 

      return mapping.findForward(SUCCESS);//redirecting to success page 
     } 
     else 
     { 
      ActionErrors errors = new ActionErrors(); 
      errors.add("both", new ActionMessage("errors.both.wrong"));//if both user name and password is incorrect, gives an error message 
      saveErrors(request,errors); 

      //closing connection and prepareStatement objects 
      db.releasePreparedStatement(pstmt); 
      db.releaseConnection(con); 

      return mapping.findForward(FAILURE);//redirecting to failure page 
     } 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return mapping.findForward(FAILURE);//redirecting to failure page 
    } 

Как что в каждом файле Java я следующий так же ..

В Dbconnection.java файл

public class Dbconnection 
{ 
    Connection con=null; 
    String DB_URL = "jdbc:mysql://localhost:3306/dbname"; 
    String USER = "abc";//db user name 
    String PASS = "abc";//db password 
    PreparedStatement pstmt = null; 

    public synchronized Connection getConnection() 
    { 
     try 
     { 
      Class.forName("com.mysql.jdbc.Driver");//loading mysql driver 
      con = DriverManager.getConnection(DB_URL,USER,PASS);//connecting to mysql 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return con; 
     } 

     public void releaseConnection(Connection conn)//releasing Connection 
     { 
     if(conn!=null) 
      { 
      try 
       { 
       conn.close(); 
       } 
       catch(Exception e) 
       { 
       e.printStackTrace(); 
       } 
     } 
    } 

    public void releasePreparedStatement(PreparedStatement stmt)//closing PreparedStatement object 
    { 
     if(stmt!=null) 
     { 
     try 
     { 
       stmt.close(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     } 
    } 
} 

Но Иногда я получаю сообщение об успешном завершении. Но иногда я получаю сообщение об ошибке. В сервере я получаю ошибку

The operation is not allowed after ResultSet is closed 

выше проблема заключается происходит только тогда, когда несколько пользователей имеют доступ к одному файлу (бывший abc.java).

+1

Попытайтесь закрыть 'подготовленноеСвязь' перед' соединением', также вы должны добавить больше кода, потому что ResultSet, на который ссылается ваша исключение, не отображается в коде, который вы указали ... – Marcx

+0

больше кода означает? Это правильный способ создания и закрытия соединения. – Satya

+0

Добавить недостающий код в abc.java – Marcx

ответ

0

Вы должны сделать:

1) Закройте PreparedStatement и подключение в finally блоке, поэтому, если код получает exception вашего код будет правильно закрывать ресурсы, в противном случае вы могли бы иметь место утечки памяти.

2), если в вашем коде вы используете ResultSet как

ResultSet rs = pstm.executeQuery(); 
...... 

Затем вы должны закрыть его перед повторным использованием его снова ...

3) Является ли ваш метод в abc.java статический?

я буду делать что-то вроде этого, переместите метод close в finally блоке, чтобы предотвратить утечку памяти в случае исключения

public ActionForward execute(----) { 
    Dbconnection db=null; 
    Connection con=null; 
    PreparedStatement pstmt = null; 
    ResultSet rs = null; 

    try { 
     db=new Dbconnection();//instantiating user defined Dbconnection class object 
     con=db.getConnection();//creating connection object 

     // some code 
     Login_Check formBean = (Login_Check) form;//bean class object 

     pstmt = con.prepareStatement("select type from user_registration where user_name=? and password=? and user_status=?"); 
     //form parameter values 
     pstmt.setString(1, formBean.getUname().trim()); 
     pstmt.setString(2, formBean.getPassword().trim()); 
     pstmt.setString(3, "Active"); //user status should be active 

     rs = pstmt.executeQuery(); 

     if(rs.next()) 
     { 
      /* some code */ 
      return mapping.findForward(SUCCESS);//redirecting to success page 
     } 
     else 
     { 
      ActionErrors errors = new ActionErrors(); 
      errors.add("both", new ActionMessage("errors.both.wrong"));//if both user name and password is incorrect, gives an error message 
      saveErrors(request,errors); 
      return mapping.findForward(FAILURE);//redirecting to failure page 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally { 
     db.releaseResultSet(rs); 
     db.releasePreparedStatement(pstmt); 
     db.releaseConnection(con); 
    } 

    return mapping.findForward(FAILURE);//redirecting to failure page 
    } 

Вы, очевидно, необходимо добавить новый метод releaseResultSet в DBConnection выпустить набор ...

+0

привет @ Marcx, я обновил код. Не могли бы вы рассказать мне правильный способ написать. – Satya

+0

Я отредактировал мой код, чтобы он соответствовал вашим ... – Marcx

+0

Если условие истинно, оно будет перенаправлено на страницу успеха. Этот код закроет соединение db. – Satya

Смежные вопросы