powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как прервать запрос к БД через JDBC?
4 сообщений из 4, страница 1 из 1
Как прервать запрос к БД через JDBC?
    #34084624
Andy Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как правильно прервать выполнение SQL запроса через JDBC драйвер?

В частности меня интересует Oracle.

Пробовал выполнение PreparedStatement в отдельном потоке и для его прерывания метод cancel(). Не работает! :(
...
Рейтинг: 0 / 0
Как прервать запрос к БД через JDBC?
    #34084817
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая версия JDBC-драйверов? У меня вроде работает с JDBC 10.2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
 import  java.sql.*;
 import  java.util.Locale;
 import  java.util.Calendar;
 import  java.text.SimpleDateFormat;

 public   class  StatementCancelTest {

   private   static   final  String USERNAME = "<username>";

   private   static   final  String PASSWORD = "<password>";

   private   static   final  String SERVER = "jdbc:oracle:thin:@<host>:1521:<SERVICE_NAME>";

   public   static   void  main(String args[])
     throws  Exception {
    Locale.setDefault(Locale.ENGLISH);
    DriverManager.registerDriver( new  oracle.jdbc.OracleDriver());
    Connection con = DriverManager.getConnection(SERVER, USERNAME, PASSWORD);
    con.setAutoCommit(false);

    PreparedStatement pst = con.prepareStatement(
      "begin\n" +
      "  loop dbms_lock.sleep(2); end loop;\n" +
      "end;"
    );

    SimpleDateFormat dateFormat =  new  SimpleDateFormat("dd.MM.yyyy hh:mm:ss");
    System.out.println(
      dateFormat.format( new  Date(Calendar.getInstance().getTimeInMillis()))
    );
    StatementThread statementThread =  new  StatementThread(pst);
    Thread.sleep( 10000 );
    pst.cancel();
    System.out.println("pst.cancel()");
    System.out.println(
      dateFormat.format( new  Date(Calendar.getInstance().getTimeInMillis()))
    );
  }
}

 class  StatementThread
   extends  Thread {

  PreparedStatement pst;

   public  StatementThread(PreparedStatement pst) { this .pst = pst;}

   public   void  run() {
     try  {
      pst.execute();
    }  catch  (SQLException e) {
      System.err.println("Error executing statement\n" + e.toString());
       throw   new  RuntimeException("Error executing statement\n" + e.toString());
    }
  }
}

...
Рейтинг: 0 / 0
Как прервать запрос к БД через JDBC?
    #34084843
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, чуть облажался, надо поправить одну строку:
Код: plaintext
1.
2.
//StatementThread statementThread = new StatementThread(pst);
 new  StatementThread(pst).start();

В результате:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Error executing statement
java.sql.SQLException: ORA-01013: user requested cancel of current operation
ORA-06512: at "SYS.DBMS_LOCK", line 201
ORA-06512: at line 2

Exception in thread "Thread-0" java.lang.RuntimeException: Error executing statement
java.sql.SQLException: ORA-01013: user requested cancel of current operation
ORA-06512: at "SYS.DBMS_LOCK", line 201
ORA-06512: at line 2

	at StatementThread.run(StatementCancelTest.java:56)
...
Рейтинг: 0 / 0
Как прервать запрос к БД через JDBC?
    #34085142
Andy Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос снимается!

Действительно метод cancel() работает. У меня была ошибка в программе.

Спасибо Denis Popov.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как прервать запрос к БД через JDBC?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]