Операция не разрешена после закрытия ResultSet при исключении javasql - PullRequest
0 голосов
/ 04 июля 2018

Я создаю простой 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();
 }

}

1 Ответ

0 голосов
/ 04 июля 2018

Вы закрываете соединение после одной итерации, что приведет к Операция не разрешена после закрытия 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
     }
    }

или даже вы можете использовать try с ресурсом, он автоматически закроет все ресурсы

 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
        }
     }

я не тестировал второй, потому что в этой машине нет среды

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...