sql >> Database >  >> RDS >> Mysql

Hoe com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException op te lossen:Geen bewerkingen toegestaan ​​nadat de verbinding is gesloten. uitzondering?

Bent u zich bewust van het feit dat u de backend daadwerkelijk vanuit uw GUI benadert? U geeft parameters uit tekstvelden rechtstreeks door aan uw database. Dit is een bron voor grote fuckups. Valideer in ieder geval je input, of Little Bobby Tables zal uw arbeidscontract voortijdig beëindigen.

Wat betreft uw fout:Sorry, maar deze code moet grondig worden aangepast. Alleen door het aantal regels doet deze code te veel. Eerste gouden regel:houd je methoden kort. Tweede gouden regel:maak ze korter.

Het feit dat je zelf niet begrijpt wat er aan de hand is, is voor jou een groot rood licht en geeft aan dat je je ontwerp moet heroverwegen.

  • Maak de methoden die dingen schrijven met JDBC.putData() standalone.
  • Doe hetzelfde met JDBC.getData().
  • Zie een patroon ontstaan.

Ik denk dat het een voortijdige oproep is naar connection.close() in JDBC. Door uw bewerkingen op te splitsen in meer atomaire, kunt u beter redeneren over uw code, waardoor u de fout begrijpt.

Sorry voor het niet leveren van een oplossing, maar op de lange termijn ben je beter af door je aan enkele codeprincipes te houden. Leer ze! Hoe eerder hoe beter en aangezien ik wat meer karma nodig heb:Lees "Clean-Code" van Robert C. Martin.http://www.amazon.de/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

Je bevindt je dan op het pad van verlichting en gebruikt dus een DAOFactory (hinting) en het DAO-ontwerppatroon (ook hinting) en wordt een codergod. Gefeliciteerd!

Welnu, hier is een kleine gids over hoe de refactoring eruit zou kunnen zien. Niet voltooid en niet getest, en ik denk dat ik de SQL-invoegvolgorde heb verprutst (ik weet niet welke transactie-ID waar wordt gebruikt). Maar ik hoop dat je een idee krijgt. Fijne dag en welkom in Jamaica!

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



}

Natuurlijk stopt de reis daar niet. Ik heb de JDBC saveTotal() niet afgemaakt. Ik ben er net mee begonnen, jij doet de rest.

Houd er rekening mee dat ik deze code niet heb getest met een database (bepaalde sql ddl-bestanden ontbraken). Ook heb ik het terugdraaimechanisme niet gebruikt. Bovendien leeft saveTotal() in JDBC, waar het niet thuishoort. Gebruik saveTotal in uw GUI (indien nodig) en laat alle databasetoegangen door SuperDAO stromen. Dit is niet het beste ontwerp, maar het is niet te abstract en je kunt gemakkelijk zien hoe de scheiding van zorg je code een beetje leesbaarder en onderhoudbaarder maakt.




  1. SQLite-queryresultaten uitvoeren als een INSERT-instructie

  2. psycopg2.OperationalError:FATAL:niet-ondersteund frontend-protocol 1234.5679:server ondersteunt 2.0 tot 3.0

  3. Een tabel maken in SQL - Voorbeeldquery van Postgres en MySQL

  4. MySQL LEFT JOIN, GROUP BY en ORDER BY werkt niet zoals vereist