Ключи предварительной выборки Oracle 11g JDBC

#database #oracle #jdbc #oracle11g #auto-increment

#База данных #Oracle #jdbc #oracle11g #автоматическое увеличение

Вопрос:

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

Я использую JDBC на уровне изоляции с фиксированным чтением с пакетными обновлениями. Поэтому извлечение ключей с помощью getGeneratedKeys невозможно. Мой план состоит в том, чтобы извлекать диапазон идентификаторов из базы данных безопасным для транзакций способом, например. две параллельные транзакции не могут получить одни и те же ключи.

Могу ли я написать некоторый SQL-запрос с количеством будущих строк в качестве аргумента для получения списка будущих ключей в Oracle 11g?

Какие у меня здесь варианты?

Ответ №1:

для этой цели можно использовать последовательности:

 create sequence s;
  

для получения идентификатора

 select s.nextval from dual;
  

или для получения диапазона идентификаторов :

 select s.nextval from dual connect by level <= 10;
  

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

1. Спасибо, не могли бы вы подробнее рассказать о безопасности транзакций этого метода? Является ли dual каким-то волшебным прудом для всех автоматически увеличиваемых ключей всех таблиц?

2. И как dual узнает, для какой таблицы мне нужны ключи?

3. Вы можете создавать столько последовательностей, сколько захотите. Нередко для каждой таблицы используется одна последовательность. выберите table1_seq.nextval из dual; выберите table2_seq из dual; и т.д.

4. Таблица с именем DUAL — это небольшая таблица в словаре данных, на которую могут ссылаться базы данных Oracle и пользовательские программы, чтобы гарантировать известный результат. В этой таблице есть один столбец с именем DUMMY и одна строка, содержащая значение X.

Ответ №2:

Просто хотел добавить:

Между последовательностями и таблицами нет явной взаимосвязи. Последовательность — это просто механизм для генерации числовых последовательностей. Вы можете предположить, что последовательность никогда не создаст повторяющееся значение, и это все. Не предполагайте порядок и определенно не ожидайте последовательности без пробелов. Последовательности выполняются таким образом в Oracle по замыслу. Следуя этим правилам и не делая никаких других предположений о поведении последовательности, мы получаем чрезвычайно масштабируемую производительность с последовательностями. Обратите внимание, что как только вы пытаетесь применить порядок или последовательность без пробелов, ваша производительность серьезно снижается.

Вкратце: 1.) Последовательности очень просты и очень быстры. 2.) Кроме «без сбоев», не предполагайте, что вы можете предсказать поведение последовательности. 3.) Последовательности являются независимыми объектами, не привязанными к таблице, и могут использоваться для генерации значений последовательности, которые будут использоваться в одной таблице или во многих разных таблицах.

Надеюсь, это поможет.