Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment réparer com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException :Aucune opération autorisée après la fermeture de la connexion. exception?

Êtes-vous conscient du fait que vous accédez réellement au backend depuis votre interface graphique ? Vous transmettez les paramètres des champs de texte directement à votre base de données. C'est une source de conneries majeures. Validez au moins votre entrée, ou Little Bobby Tables mettra fin prématurément à votre contrat de travail.

Quant à votre erreur :Désolé, mais ce code nécessite une refactorisation majeure. Seul à la ligne, ce code en fait trop. Première règle d'or :Gardez vos méthodes courtes. Deuxième règle d'or :raccourcissez-les.

Le fait que vous ne compreniez pas vous-même ce qui se passe est un gros feu rouge pour vous et montre que vous devez reconsidérer votre conception.

  • Rendez les méthodes qui écrivent des choses avec JDBC.putData() autonomes.
  • Faites de même avec JDBC.getData().
  • Observez l'émergence d'un modèle.

Je suppose que c'est un appel prématuré à connection.close() dans JDBC. En fractionnant vos opérations en opérations plus atomiques, vous pouvez mieux raisonner sur votre code, et ainsi comprendre l'erreur en question.

Désolé de ne pas fournir de solution, mais à long terme, vous feriez mieux de respecter certains principes de code. Apprenez-les ! Le plus tôt sera le mieux et comme j'ai besoin de plus de karma :Lisez "Clean-Code" de Robert C. Martin.http://www.amazon.de/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

Vous serez alors sur la voie de l'illumination et utiliserez ainsi une DAOFactory (indice) et le design pattern DAO (également indice) et deviendrez un dieu codeur. Félicitations !

Eh bien, voici un petit guide sur à quoi pourrait ressembler le refactoring. Pas fini et non testé, et je suppose que j'ai foiré la séquence d'insertion SQL (je ne sais pas quel transactionId est utilisé où). Mais j'espère que vous aurez une idée. Bonne journée et bienvenue en Jamaïque !

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



}

Bien sûr, le voyage ne s'arrête pas là. Je n'ai pas terminé le JDBC saveTotal(). Je viens de le commencer, vous faites le reste.

Veuillez noter que je n'ai pas testé ce code par rapport à une base de données (certains fichiers sql ddl manquaient). De plus, je n'ai pas utilisé le mécanisme de restauration. De plus, saveTotal() réside dans JDBC, auquel il n'appartient pas. Utilisez saveTotal dans votre interface graphique (si nécessaire) et laissez tous les accès à la base de données passer par SuperDAO. Ce n'est pas la meilleure conception mais ce n'est pas trop abstrait et vous pouvez facilement voir comment la séparation des préoccupations rend votre code un peu plus lisible et maintenable.