Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách sửa lỗi com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Không có hoạt động nào được phép sau khi kết nối đóng. ngoại lệ?

Bạn có biết thực tế là bạn đang thực sự truy cập phần phụ trợ từ bên trong GUI của mình không? Bạn đang chuyển trực tiếp các tham số từ các trường văn bản vào cơ sở dữ liệu của mình. Đây là một nguồn cho các cuộc chơi lớn. Ít nhất hãy xác thực thông tin đầu vào của bạn hoặc Little Bobby Tables sẽ kết thúc sớm hợp đồng làm việc của bạn.

Đối với lỗi của bạn:Xin lỗi, nhưng mã này cần tái cấu trúc lớn. Một mình bên dòng đếm mã này làm quá nhiều. Quy tắc vàng đầu tiên:Giữ cho các phương pháp của bạn ngắn gọn. Quy tắc vàng thứ hai:Làm cho chúng ngắn hơn.

Việc bản thân bạn không hiểu chuyện gì đang xảy ra là một đèn đỏ lớn cho bạn và cho thấy rằng bạn cần phải xem xét lại thiết kế của mình.

  • Tạo các phương thức ghi nội dung bằng JDBC.putData () độc lập.
  • Làm tương tự với JDBC.getData ().
  • Thấy một hình mẫu đang nổi lên.

Tôi đoán đó là một cuộc gọi quá sớm tới connection.close () trong JDBC. Bằng cách phân chia các hoạt động của bạn thành nhiều nguyên tử hơn, bạn có thể suy luận về mã của mình tốt hơn, do đó hiểu được lỗi trong tầm tay.

Xin lỗi vì đã không đưa ra giải pháp, nhưng về lâu dài, tốt hơn hết bạn nên tuân thủ một số nguyên tắc mã. Học chúng! Càng sớm càng tốt và vì tôi cần thêm một số nghiệp vụ:Đọc "Clean-Code" của Robert C. Martin. http://www.amazon.de/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

Sau đó, bạn sẽ đi trên con đường giác ngộ và do đó sử dụng DAOFactory (gợi ý) và mẫu thiết kế DAO (cũng là gợi ý) và trở thành một vị thần lập trình viên. Xin chúc mừng!

Đây là một hướng dẫn nhỏ về cách cấu trúc lại có thể trông như thế nào. Chưa hoàn thành và chưa được kiểm tra, và tôi đoán là tôi đã tạo ra chuỗi chèn SQL (không biết giao dịch nào được sử dụng ở đâu). Nhưng tôi hy vọng bạn sẽ có ý tưởng. Chúc một ngày tốt lành và chào mừng bạn đến với 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();
    }



}

Tất nhiên cuộc hành trình không dừng lại ở đó. Tôi đã không hoàn thành JDBC saveTotal (). Tôi chỉ mới bắt đầu nó, bạn làm phần còn lại.

Xin lưu ý rằng tôi đã không kiểm tra mã này với cơ sở dữ liệu (một số tệp ddl sql bị thiếu). Ngoài ra, tôi đã không sử dụng cơ chế quay lui. Hơn nữa, saveTotal () nằm trong JDBC, nơi nó không thuộc về. Sử dụng saveTotal trong GUI của bạn (nếu cần) và cho phép tất cả các truy cập cơ sở dữ liệu chảy qua SuperDAO. Đây không phải là thiết kế tốt nhất nhưng nó không quá trừu tượng và bạn có thể dễ dàng thấy cách tách biệt mối quan tâm làm cho mã của bạn dễ đọc và dễ bảo trì hơn một chút.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có thể sắp xếp lại các lựa chọn SQL sau khi đã áp dụng giới hạn không?

  2. qt5.1.1 mysql ubuntu Trình điều khiển QMYSQL không được tải

  3. Tên bảng thoát MySQL

  4. Mã duy nhất dựa trên địa chỉ email duy nhất trong bảng mysql?

  5. Các lớp lồng nhau - CustomRowMapper !! Nó không còn là một vấn đề nữa !! - Phần 1