【问题标题】:Access result Set after closing connection with db关闭与db的连接后访问结果集
【发布时间】:2018-06-21 11:00:00
【问题描述】:
public ResultSet Connections() {

    try {
        conn = this.connect();
        stmt = conn.createStatement();
        //  String sql = "Select * from connections";
        String sql = "SELECT name , pass , ip , port , dbName , dbType FROM connections";
        rsc = stmt.executeQuery(sql);
        rsc.next();

    } catch (SQLException ex) {
        System.out.println("Conns error " + ex);

    }
    return rsc;
} 

我需要关闭与 db 的连接并从结果集中检索数据。但是如果我在返回语句最终无法访问结果集之前关闭它。

【问题讨论】:

  • 这是不可能的。您可以将结果提取到某个变量中,然后关闭连接。

标签: java sqlite resultset


【解决方案1】:

不要返回ResultSet,让它保持打开足够长的时间然后关闭它。最好的办法是将其读入另一个数据结构,例如List,然后返回所述列表:

我还建议使用 try-with-resources-statements:

public List<Connections> Connections() {
    String sql = "SELECT name , pass , ip , port , dbName , dbType FROM connections";

    try(Connection conn = this.connect(); 
        Statement stmt = conn.createStatement()
        ResultSet rsc = stmt.executeQuery(sql)) {
        List<Connections> list = new ArrayList<>();
        while(rsc.next()){
            list.add(new Connections(
                rsc.getString("name"),
                rsc.getString("pass"),
                rsc.getInt("ip"),
                rsc.getInt("port"),
                rsc.getString("dbName"),
                rsc.getInt("dbType")
            ));
        }
        return list;
    } catch (SQLException ex) {
        System.out.println("Conns error " + ex);
        return new ArrayList<>();
    }
} 

你的Connections 类看起来像这样:

public class Connections{

    // fields

    public Connections(String name, String pass, int ip, int port, String dbName, int dbType){
         // assing parameters to fields
    }

    // getters and setters
}

【讨论】:

  • 这解决了我的问题,即使你必须改变我的一些其他方法。
  • @LotusPrime 很高兴我提供了帮助。长时间保持 ResultSet 处于打开状态,这主要是糟糕的设计。所以现在重构你的代码可能比以后在应用程序中出现资源泄漏和意外错误更好
【解决方案2】:

据我所知,更好的方法是在trycatch 中添加finally 子句并在那里关闭您的连接。如果您通过您的方法抛出错误,那会更好。例如

    public ResultSet Connections() throws SQLException {

        try {
            conn = this.connect();
            stmt = conn.createStatement();
            //  String sql = "Select * from connections";
            String sql = "SELECT name , pass , ip , port , dbName , dbType FROM connections";
            rsc = stmt.executeQuery(sql);
            rsc.next();

            return rsc;

        } catch (SQLException ex) {
            throw new SQLException(ex.getMessage());

        } finally {
          //your connection closing code here
          conn.close();//it depends upon your code
    }

} 

【讨论】:

  • 我没有问题。 OP 有:但如果我在 return 语句最终无法访问结果集之前关闭它。finally 将在return 语句之后调用。所以结果集也会被关闭
  • 表示你没有得到任何结果
  • 很抱歉,这是错误的。 ResultSet 关闭后会抛出异常,因此可能有结果但不再可用,因为它已关闭
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 2019-02-19
  • 2010-09-11
  • 2018-10-09
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多