Поддерживает ли Oracle DB несколько (параллельных) операций для каждого соединения?

#java #oracle #connection

#java #Oracle #соединение

Вопрос:

Моему Java-приложению необходимо некоторое время удерживать курсор на Oracle DB. Во время этого должны быть выполнены другие инструкции DB. Требуется ли для этого отдельные подключения к БД или можно использовать одно и то же (курсорное)?

Спасибо.

Комментарии:

1. вы пробовали? какие результаты это дало?

2. О каком Java-приложении вы говорите? Oracle отлично подходит для выделенных сеансов, которые обрабатывают серию инструкций. Однако большинство приложений Java являются веб-приложениями, а веб-приложения обычно используют протоколы без состояния и пул соединений; это означает, что сложно зарезервировать один сеанс базы данных для конкретного пользователя для выдачи команд в течение определенного периода времени. Итак, пожалуйста, более подробную информацию. Также вы имели в виду «параллельный» или это должно быть «последовательный»? Oracle поддерживает параллельный запрос / DML, но это другой вопрос.

Ответ №1:

Единственное ограничение заключается в том, что один оператор может иметь только один результирующий набор в данный момент времени. Обратите внимание, что оператор может выдавать несколько наборов результатов, но вы должны обращаться к ним последовательно (используя getNextResult() )

Чтобы иметь возможность иметь несколько открытых наборов результатов / курсоров, вам нужно несколько java.sql.Statement объектов.

У одного соединения может быть только один активный (т. Е. выполняющийся) оператор. Итак, если вам нужно несколько открытых курсоров (наборов результатов), вам нужно запускать их последовательно (один за другим), каждый со своим Statement объектом.

Ответ №2:

У Oracle нет проблем с тем, что в MSSQL называют MARS (несколько активных наборов результатов).

Вы можете видеть подобные вещи во многих кодах PL / SQL, и если уж на то пошло, PL / SQL является «просто» клиентом для SQL engine, как и ваш Java-код:

 for a in (select field1, field2 from table1) loop
  for b in (select * from table2 where SomeField = a.Field1) loop
    ...
  end loop;
end loop;
  

Однако не верьте мне на слово. Подобный вложенный цикл вы можете создать самостоятельно в Java.

Ответ №3:

Конечно, вы можете удерживать несколько открытых курсоров, пока выполняете другие запросы по тому же соединению. Однако невозможно выполнить другие запросы или инструкции, пока открыт первый курсор. Это потому, что только один запрос может быть активным (т. Е. выполняемым) в сеансе Oracle в любой момент времени.

Ответ №4:

Вы можете использовать концепцию объединения баз данных в пул.

Нажмите здесь

Он предоставляет пул подключений к базе данных, поэтому при необходимости вы можете получить подключение к базе данных из пула.

Кроме того, оптимизирована память, поскольку подключение и закрытие базы данных — сложный процесс.

Комментарии:

1. Весь смысл вопроса заключался в том, что OP не хочет множественных подключений, но хочет знать, может ли он выполнять другие sqll одновременно с сохранением курсора открытым — что он может!

2. Да, я могу (и, вероятно, буду) использовать объединение в пул, но, как указал Джеймс, вопрос был об использовании того же соединения.