2011-05-10 2 views
5

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

Спасибо.

+0

Вы попробовали? какие результаты это дало? – Mat

+0

нет, у меня нет. но – Ralkie

+0

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

ответ

5

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

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

Одно соединение может иметь только один активный (то есть работающий) оператор. Поэтому, если вам нужно несколько открытых курсоров (ResultSets), вы должны последовательно запускать их (один за другим) каждый со своим собственным объектом Statement.

3

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

Вы можете увидеть такие вещи в большом количестве PL кода/SQL, и по этому вопросу PL/SQL является «просто» клиент к SQL двигатель, как ваш код 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.

0

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

Click Here

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

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

+0

Вся суть вопроса заключалась в том, что OP не хочет множественных подключений, но хочет знать, может ли он выполнять другие sqls одновременно с тем, чтобы держать курсор открытым - что он может! –

+0

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

1

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

Смежные вопросы