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机制是的,连接应该传递到单独的数据访问类中,您应该自己创建和测试该类。为控制器提供该基于接口的类的实例并调用其方法。