SQL异常:ResultSet关闭后不允许操作

时间:2017-09-12 03:16:18

标签: java mysql resultset

我得到一个异常“ResultSet关闭后不允许操作”,该函数每次都会关闭结果集。我应该在函数中添加'synchronized'吗?或者如何解决这个异常?

        public static ArrayList<Region> getHotProductRegionList() {

            ArrayList<Region> list = new ArrayList<Region>();

            ResultSet rs = null;
            conn.checkConn();
            try {
                    if (getHotProductRegionStmt==null) getHotProductRegionStmt = conn.prepareStatement(getHotProductRegionStr);
                    rs = getHotProductRegionStmt.executeQuery();
                    if (rs!=null) {
                            while (rs.next()) {
                                    Region r = new Region();
                                    setRegion(r, rs);
                                    list.add(r);
                            }
                            rs.close();
                    }
            } catch (Exception e) {
                    J.m("RegionManager.getHotProductRegion Exception: " + e.getMessage());
                    e.printStackTrace();
            }
            if (rs!=null) try { rs.close(); } catch (Exception ex) {}
            return list;
    }
    private static PreparedStatement getHotProductRegionStmt = null;
    private static String getHotProductRegionStr = " SELECT * FROM Region";

PreparedStatement重置代码:

        private static DBConn conn = new DBConn("RegionManager") {
            public void resetAll() {
                    getHotProductRegionStmt = reset(getHotProductRegionStmt);                  
            }
    };

2 个答案:

答案 0 :(得分:0)

你的整个方法在这里是错误的。您应该在每次调用此方法时使用新的本地ConnectionPreparedStatement,然后关闭它们,并使用连接池来减轻影响。使用静态Connection不是线程安全的,使用静态PreparedStatement根本不会起作用。

答案 1 :(得分:-1)

您正尝试关闭两次结果集。而是在finally块下关闭结果集。

try{ }
catch(Exception e){}
finally{
     if(rs!=null)
           rs.close();
}