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

时间:2017-08-20 21:57:24

标签: java mysql jdbc

如何解决这个问题以及这段代码有什么问题? 我知道之前已经问过这个问题,但我无法解决问题

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) {

        }
    }
}          

1 个答案:

答案 0 :(得分:1)

您的ResultSet和PreparedStatement未在方法范围内声明,因此我必须假设您已在其他地方声明它们。

这是一个很大的错误。

您应该在方法范围中声明Statement和ResultSet。

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

还有其他一些我批评你的代码的东西(例如SELECT *,将UI和数据库代码混合在一起),但这足以启动。

从界面开始:

1

然后写一个具体的实现:

Loaded += (s, e) =>
{
    // GetChildByName comes from
    // https://github.com/JustinXinLiu/Continuity/blob/0cc3d7556c747a060d40bae089b80eb845da84fa/Continuity/Extensions/UtilExtensions.cs#L44
    var layerGrid = mapControl.GetChildByName<Grid>("LayerGrid");
    var canvas1 = layerGrid.Children.First();

    Canvas.SetZIndex(canvas1, 1);
};

这是你可以用JUnit测试的东西。让它完美运行,然后提供您的UI代码的引用。它会将UI和数据库代码分开。您可以在任何应用程序中使用此DAO,而无需担心Swing或Web UI。