Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak naprawić com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Żadne operacje nie są dozwolone po zamknięciu połączenia. wyjątek?

Czy zdajesz sobie sprawę z tego, że faktycznie uzyskujesz dostęp do backendu z poziomu swojego GUI? Przekazujesz parametry z pól tekstowych bezpośrednio do swojej bazy danych. To jest źródło poważnych wpadek. Przynajmniej zweryfikuj swoje dane wejściowe lub Małe stoliki Bobby przedwcześnie zakończy umowę o pracę.

Co do twojego błędu:Przepraszamy, ale ten kod wymaga poważnej refaktoryzacji. Sam na liczniku linii ten kod robi za dużo. Pierwsza złota zasada:używaj krótkich metod. Druga złota zasada:skróć je.

Fakt, że sam nie rozumiesz, co się dzieje, jest dla Ciebie dużym czerwonym światłem i pokazuje, że musisz ponownie przemyśleć swój projekt.

  • Uczyń metody, które piszą rzeczy za pomocą JDBC.putData() jako samodzielne.
  • Zrób to samo z JDBC.getData().
  • Zobacz pojawiający się wzór.

Myślę, że jest to przedwczesne wywołanie connection.close() w JDBC. Dzieląc swoje operacje na bardziej niepodzielne, możesz lepiej wnioskować o swoim kodzie, a tym samym zrozumieć występujący błąd.

Przepraszam, że nie dostarczasz rozwiązania, ale na dłuższą metę lepiej będzie, jeśli będziesz przestrzegać pewnych zasad kodu. Naucz się ich! Im szybciej tym lepiej i ponieważ potrzebuję więcej karmy:Przeczytaj „Clean-Code” Roberta C. Martina.http://www.amazon.de/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

Będziesz wtedy na ścieżce oświecenia, a tym samym użyjesz DAOFactory (podpowiedź) i wzorca projektowego DAO (również podpowiedzi) i zostaniesz bogiem kodera. Gratulacje!

Cóż, oto mały przewodnik po tym, jak może wyglądać refaktoryzacja. Nie skończone i nieprzetestowane, i chyba zepsułem sekwencję wstawiania SQL (nie wiem, który identyfikator transakcji jest używany gdzie). Ale mam nadzieję, że wpadniesz na pomysł. Miłego dnia i witaj na Jamajce!

package mysqlfix;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextField;

public class JDBC {

    static Connection con = null;
    static boolean b;
    static PreparedStatement state;

    public static void setCon() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/lottery", "root", "123");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static Connection getCon() throws Exception {
        if (con == null) {
            setCon();
        }
        return con;
    }

    public static boolean putData(String sql) {
        try {
            getCon().setAutoCommit(false);
            state = getCon().prepareStatement(sql);
            state.executeUpdate();
            getCon().commit();
            b = true;
        } catch (Exception e) {
            e.printStackTrace();
            b = false;
        }
        return b;
    }

// connection commit
    public static void commit() {
        try {
            con.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    // rollback data
    public static void rollback() {
        if (con != null) {
            try {
                con.rollback();
            } catch (SQLException ex) {
                Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

// close statement
    public static void putClose() {
        try {
            state.close();
        } catch (SQLException ex) {
            Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    // close connection

    public static void conClose() {
        try {
            con.setAutoCommit(true);
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

// clear prepared statement
    public static void putClear() {
        try {
            if (state != null && !state.isClosed()) {
                state.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

// clear the connection
    public static void conClear() {
        try {
            if (con != null && !con.isClosed()) {
                con.setAutoCommit(true);
                con.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static ResultSet getData(String sql) throws Exception {
        Statement state = getCon().createStatement();
        ResultSet rs = state.executeQuery(sql);
        return rs;
    }

    public void saveTotal(JTextField txtGtotal, JTextField txtPTotal) {
        SuperDAO superDAO = new SuperDAO();

        if (superDAO.getMaxIdFromOrder() > 0) {
            Date date1;
            date1 = new Date();
            String txtGTotalFromTextField = txtGtotal.getText();
            String txtPTotalFromTextField = txtPTotal.getText();
            boolean b1 = false;
                    //regarding the transaction id...
            //this changes whilst updating the table transaction.

            int transactionId = -1;
            if (txtGTotalFromTextField.matches("[a-zA-Z]")) {
                transactionId = superDAO.insertOrderIntoTransaction(date1, txtGTotalFromTextField);
                //b1 = JDBC.putData("insert into transaction(tr_date, amount, tr_type) values ('" + date1 + "' , '" + txtGTotalFromTextField + "' , 'order')");
            }
            if (transactionId > 0) {
                try {
                } catch (Exception ex) {
                    Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
                }
                if (txtPTotalFromTextField.matches("[a-zA-Z]")) {
                    transactionId = superDAO.insertProfitIntoTransaction(date1, txtGTotalFromTextField);
                }
                JDBC.putData("insert into o_de(or_id, tr_id, oday, gtotal) values ('" + superDAO.getMaxIdFromOrder() + "' , '" + transactionId + "','" + date1 + "','" + txtGtotal.getText() + "' )");
                JDBC.putData("insert into order_profit(or_id, tr_id, ptotal) values ('" + superDAO.getMaxIdFromOrder() + "' , '" + transactionId + "','" + txtPTotal.getText() + "' )");

                                                        //JDBC.commit();
                //JOptionPane.showMessageDialog(null, "Order Saved Sucessfully..");
                JDBC.putClose();
                JDBC.conClose();

            }

        }

    }

}



package mysqlfix;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author edm
 */
public class SuperDAO {

    Connection conn;

    public SuperDAO() {
        try {
            this.conn = JDBC.getCon();
        } catch (Exception ex) {
            Logger.getLogger(SuperDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getMaxIdFromOrder() {

        try {
            ResultSet rs = JDBC.getData("select MAX(or_id) as or_id from `order`");
            if (rs.first()) {

                return rs.getInt("or_id");
            }
        } catch (SQLException ex) {
            Logger.getLogger(SuperDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(SuperDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return -1;
    }

    public int getMaxIdFromTransaction() {
        ResultSet rs;
        try {
            rs = JDBC.getData("select MAX(tr_id) as tr_id from transaction");
            if (rs.first()) {
            return rs.getInt("tr_id");
        }
        } catch (Exception ex) {
            Logger.getLogger(SuperDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return -1;
    }


    public int insertOrderIntoTransaction(Date date, String text) {
        JDBC.putData("insert into transaction(tr_date, amount, tr_type) values ('" + date + "' , '" + text + "' , 'order')");
        return getMaxIdFromTransaction();
    }

     public int insertProfitIntoTransaction(Date date, String text) {
        JDBC.putData("insert into transaction(tr_date, amount, tr_type) values ('" + date + "' , '" + text + "' , 'profit')"); 

        return getMaxIdFromTransaction();
    }



}

Oczywiście na tym podróż się nie kończy. Nie ukończyłem JDBC saveTotal(). Dopiero zacząłem, resztę zrobisz.

Proszę zauważyć, że nie testowałem tego kodu w bazie danych (brakowało niektórych plików sql ddl). Nie korzystałem też z mechanizmu wycofywania. Ponadto saveTotal() znajduje się w JDBC, gdzie nie należy. Użyj saveTotal w swoim GUI (jeśli to konieczne) i pozwól, aby wszystkie dostępy do bazy danych przepływały przez SuperDAO. To nie jest najlepszy projekt, ale nie jest zbyt abstrakcyjny i możesz łatwo zobaczyć, jak oddzielenie troski sprawia, że ​​twój kod jest trochę bardziej czytelny i łatwiejszy w utrzymaniu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przeanalizować dane z obiektu Rows w node.js,express.js,mysql2

  2. Nie można zalogować się do mysql 5.7.9 po zmianie hasła

  3. Zatrzymaj okna usługi MySQL

  4. MySQL:zaznaczanie wielu pól w wielu zmiennych w procedurze składowanej

  5. Kontynuacja:jak modelować rabaty na pozycje w bazie danych?