Java com.mysql.jdbc.exception.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许执行任何操作

Java com.mysql.jdbc.exception.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许执行任何操作,java,mysql,jdbc,Java,Mysql,Jdbc,如何解决这个问题?代码中有什么错误? 我知道以前有人问过这个问题,但我不能解决这个问题 private void cb_categoriesPopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) { cb_categories.removeAllItems(); try { S

如何解决这个问题?代码中有什么错误? 我知道以前有人问过这个问题,但我不能解决这个问题

private void cb_categoriesPopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {                                                         
     cb_categories.removeAllItems();
    try {
        String sql_c = "SELECT * FROM inventory.categories";
        cc.pst = cc.c.prepareStatement(sql_c);
        cc.rs = cc.pst.executeQuery();
        while (cc.rs.next()) {
            String c_name = cc.rs.getString("CategoryName");
            cb_categories.addItem(c_name);

        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    } finally {
        try {
            cc.rs.close();
            cc.pst.close();
        } catch (Exception e) {

        }
    }
}          

您的ResultSet和PreparedStatement没有在方法作用域中声明,所以我必须假设您已经在其他地方声明了它们

这是个大错误

您应该在方法范围中声明语句和结果集

您试图关闭资源,但应该将它们包装在单独的try/catch块中。你不能冒险关闭其中一个而不是另一个

对于您的代码,我还有其他一些地方要批评,例如选择*,将UI和数据库代码混合在一个类中,但这就足够开始了

从一个界面开始:

package persistence;

import java.util.List;

/**
 * Created by Michael
 * Creation date 8/20/2017.
 * @link https://stackoverflow.com/questions/45787151/com-mysql-jdbc-exception-jdbc4-mysqlnontransientconnectionexception-no-operatio/45787321?noredirect=1#comment78532554_45787321
 */
public interface CategoryDao {
    List<String> findAllCategories();
}
然后编写一个具体的实现:

package database;

import database.util.DatabaseUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Michael
 * Creation date 8/20/2017.
 * @link https://stackoverflow.com/questions/45787151/com-mysql-jdbc-exception-jdbc4-mysqlnontransientconnectionexception-no-operatio/45787321?noredirect=1#comment78532554_45787321
 */
public class CategoryDaoImpl implements CategoryDao {

    private static final Log LOGGER = LogFactory.getLog(CategoryDaoImpl.class);
    private static String SELECT_CATEGORIES = "SELECT CategoryName from inventory.Categories ";

    private DataSource dataSource;

    public CategoryDaoImpl(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public List<String> findAllCategories() {
        List<String> categories = new ArrayList<>();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = this.dataSource.getConnection().prepareStatement(SELECT_CATEGORIES);
            rs = ps.executeQuery();
            while (rs.next()) {
                categories.add(rs.getString("CategoryName"));
            }
        } catch (SQLException e) {
            LOGGER.error(String.format("Exception caught while selecting all category names"), e);
        } finally {
            DatabaseUtils.close(rs);
            DatabaseUtils.close(ps);
        }
        return categories;
    }
}

这是可以在JUnit关闭的情况下进行测试的内容。让它完美地运行,然后引用您的UI代码。它将把用户界面和数据库代码分开。您可以在任何应用程序中使用此DAO,而不用担心Swing或web UI。

到底是什么问题?输出是什么?您想要的结果是什么?当组合框变为可见时,它会显示来自数据库的列表编辑您的问题,因为我不清楚您的问题!单击组合框时,它将显示来自数据库的列表。。我在其他应用程序中多次这样做,但这次它给了我一个错误为什么?从代码共享的角度来看,+1的副本也是连接实例cc正在关闭并在关闭状态下再次重用。我建议使用CollectionPooling机制是的,连接应该传递到单独的数据访问类中,您应该自己创建和测试该类。为控制器提供该基于接口的类的实例并调用其方法。