Как правильно отменить запрос ResultSet - PullRequest
3 голосов
/ 13 февраля 2020

У меня длительный запрос, который может занять до 10 минут. Чтобы позволить пользователям отменить этот запрос, мне нужно было найти способ прервать ResultSet, который у меня есть:

ResultSetMetaData metaData = rs.getMetaData();

Чтобы проверить, можно ли его отменить, я создаю другой поток

Runnable run = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000);
                    System.out.println("Closing...");
                    rs.close();
                } catch (InterruptedException ex) {
                    Logger.getLogger(DstDao.class.getName()).log(Level.SEVERE, null, ex);
                } catch (SQLException ex) {
                    Logger.getLogger(DstDao.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        run.run();

Когда этот поток закрывает его, я получаю исключение:

Exception Encountered: java.sql.SQLRecoverableException: Closed Resultset: getMetaData

Это работает, но я не хочу использовать исключение для чего-то, что является частью нормального программного потока.

Я спрашиваю, является ли это правильным способом остановить длительный запрос или есть способ отменить его, о котором я не знаю. Это правильный способ сделать это? Есть ли лучший метод? Спасибо!

...