首页 > 解决方案 > javasql异常导致ResultSet关闭后不允许操作

问题描述

我正在使用 jersey 创建简单的 rest api,在这里我将从数据库中获取的所有数据分配给变量,然后将这些变量数据作为列表返回,但出现错误。我看过其他例子,但我不明白这里有什么问题是我所做的:

public class UserDAOImpl implements UserDAO{
public List<User> readUser() {
    List<User> list = new ArrayList();
    User u = new User();
    try {
    System.out.println("inside readuser impl");
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root", "");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("select * from user");
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String address = rs.getString("address");
            u.setId(id);
            u.setName(name);
            u.setAddress(address);
            System.out.println(u);
            list.add(u); //adding user object to list
            con.close();
        }
    } catch (Exception e) {
        System.out.println(e);
    }
    return list; //returning to list for json response
 }
}

这是我的控制器,它在获取对象后给出 json 响应

@Path("/rest")
public class UserController {

@GET
@Path("/getall")
@Produces(MediaType.APPLICATION_JSON)
public List<User> getAllUser(){
    UserDAO udao = new UserDAOImpl();

    return udao.readUser();
 }

}

标签: javasqljdbc

解决方案


您在一次迭代后关闭连接,这将导致在第二次迭代中ResultSet 关闭 javasql 异常后不允许操作,将 con.close 移到循环外

public class UserDAOImpl implements UserDAO{
 public List<User> readUser() {
   List<User> list = new ArrayList();
   User u = new User();
   try {
        System.out.println("inside readuser impl");
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = 
        DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root", "");
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("select * from user");
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String address = rs.getString("address");
                u.setId(id);
                u.setName(name);
                u.setAddress(address);
                System.out.println(u);
                list.add(u); //adding user object to list
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        con.close();
        return list; //returning to list for json response
     }
    }

甚至你可以使用资源尝试它会自动关闭所有资源

 public class UserDAOImpl implements UserDAO{
    public List<User> readUser() {
        List<User> list = new ArrayList();
        User u = new User();
        try( Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root", ""); 
        Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("select * from user");){
        System.out.println("inside readuser impl");
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String address = rs.getString("address");
                u.setId(id);
                u.setName(name);
                u.setAddress(address);
                System.out.println(u);
                list.add(u); //adding user object to list
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return list; //returning to list for json response
        }
     }

我没有测试第二个,因为我在这台机器上没有环境


推荐阅读