Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да коригирате com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Не са разрешени операции след затваряне на връзката. изключение?

Наясно ли сте с факта, че всъщност осъществявате достъп до бекенда от вашия GUI? Вие предавате параметри от текстови полета директно към вашата база данни. Това е източник на големи прецакания. Поне потвърдете въведените си данни или Малки Боби Таблици ще прекрати преждевременно трудовия ви договор.

Що се отнася до вашата грешка:Съжаляваме, но този код се нуждае от основно префакториране. Сам по броя на редовете този код прави твърде много. Първо златно правило:Бъдете кратки. Второ златно правило:Направете ги по-къси.

Фактът, че вие ​​самите не разбирате какво се случва, е голяма червена светлина за вас и показва, че трябва да преразгледате своя дизайн.

  • Направете методите, които записват неща с JDBC.putData() самостоятелни.
  • Направете същото с JDBC.getData().
  • Вижте как се появява модел.

Предполагам, че това е преждевременно извикване на connection.close() в JDBC. Като разделите операциите си на по-атомни, можете да разсъждавате по-добре за кода си, като по този начин разберете каква е грешката.

Съжаляваме, че не предоставих решение, но в дългосрочен план е по-добре, като се придържате към някои принципи на кода. Научете ги! Колкото по-рано, толкова по-добре и тъй като имам нужда от повече карма:Прочетете „Clean-Code“ от Робърт К. Мартин.http://www.amazon.de/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

След това ще бъдете по пътя на просветлението и по този начин ще използвате DAOFactory (намекване) и модела за проектиране на DAO (също намекване) и ще станете бог кодер. Поздравления!

Е, ето малко ръководство за това как може да изглежда рефакторингът. Не е завършен и неизпробван и предполагам, че прецаках последователността на вмъкване на SQL (не знам кой идентификатор на транзакция къде се използва). Но се надявам, че ще получите идея. Приятен ден и добре дошли в Ямайка!

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



}

Разбира се, пътуването не спира дотук. Не завърших JDBC saveTotal(). Аз току-що го започнах, ти правиш останалото.

Моля, имайте предвид, че не съм тествал този код спрямо база данни (някои sql ddl файлове липсваха). Освен това не използвах механизма за връщане назад. Освен това saveTotal() живее в JDBC, където не му е мястото. Използвайте saveTotal във вашия GUI (ако е необходимо) и оставете всички достъпи до база данни да протичат през SuperDAO. Това не е най-добрият дизайн, но не е твърде абстрактен и лесно можете да видите как разделянето на загрижеността прави кода ви малко по-четлив и поддържащ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:@променлива срещу променлива. Каква е разликата?

  2. Актуализирайте заявката с LEFT JOIN, променлива и автоматично инкремент с помощта на MySQL

  3. Navicat за MySQL

  4. SQL дизайн за анкета с отговори от различни типове данни

  5. SQL Заменете множество променливи от друга таблица в резултата от заявката