Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So beheben Sie com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Keine Operationen erlaubt, nachdem die Verbindung geschlossen wurde. Ausnahme?

Sind Sie sich der Tatsache bewusst, dass Sie tatsächlich von Ihrer GUI aus auf das Backend zugreifen? Sie übergeben Parameter aus Textfeldern direkt an Ihre Datenbank. Dies ist eine Quelle für große Fuckups. Bestätigen Sie zumindest Ihre Eingabe oder Little Bobby Tables wird Ihren Arbeitsvertrag vorzeitig beenden.

Zu Ihrem Fehler:Entschuldigung, aber dieser Code muss umfassend überarbeitet werden. Allein durch die Anzahl der Zeilen macht dieser Code zu viel. Erste goldene Regel:Halten Sie Ihre Methoden kurz. Zweite goldene Regel:Mach sie kürzer.

Die Tatsache, dass Sie selbst nicht verstehen, was los ist, ist ein großes rotes Licht für Sie und zeigt, dass Sie Ihr Design überdenken müssen.

  • Machen Sie die Methoden, die Dinge mit JDBC.putData() schreiben, eigenständig.
  • Machen Sie dasselbe mit JDBC.getData().
  • Sehen Sie, wie sich ein Muster abzeichnet.

Ich denke, es ist ein vorzeitiger Aufruf von connection.close() in JDBC. Indem Sie Ihre Operationen in atomarere aufteilen, können Sie Ihren Code besser verstehen und so den vorliegenden Fehler verstehen.

Tut mir leid, dass ich keine Lösung geliefert habe, aber auf lange Sicht sind Sie besser dran, wenn Sie sich an einige Code-Prinzipien halten. Lerne sie! Je früher desto besser und da brauche ich noch etwas Karma:„Clean-Code“ von Robert C. Martin lesen.http://www.amazon.de/Clean-Code-Handbuch-Software-Handwerk/dp/0132350882

Sie befinden sich dann auf dem Weg der Erleuchtung und nutzen somit eine DAOFactory (Hinweis) und das DAO-Entwurfsmuster (auch Hinweis) und werden zum Coder-Gott. Herzlichen Glückwunsch!

Nun, hier ist eine kleine Anleitung, wie das Refactoring aussehen könnte. Nicht fertig und ungetestet, und ich glaube, ich habe die SQL-Einfügesequenz vermasselt (weiß nicht, welche Transaktions-ID wo verwendet wird). Aber ich hoffe, Sie bekommen eine Vorstellung. Schönen Tag noch und willkommen auf Jamaika!

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



}

Natürlich hört die Reise hier nicht auf. Ich habe das JDBC saveTotal() nicht beendet. Ich habe gerade angefangen, du machst den Rest.

Bitte beachten Sie, dass ich diesen Code nicht gegen eine Datenbank getestet habe (bestimmte SQL-DDL-Dateien fehlten). Außerdem habe ich den Rollback-Mechanismus nicht verwendet. Außerdem lebt saveTotal() in JDBC, wo es nicht hingehört. Verwenden Sie saveTotal in Ihrer GUI (falls erforderlich) und lassen Sie alle Datenbankzugriffe durch SuperDAO fließen. Dies ist nicht das beste Design, aber es ist nicht zu abstrakt, und Sie können leicht erkennen, wie die Trennung von Bedenken Ihren Code ein wenig lesbarer und wartbarer macht.