Пакетные обновления Jdbc хорошая стратегия поиска ключей - PullRequest
1 голос
/ 29 августа 2011

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

Мои идеи:

  1. Каким-то образом извлеките последующие разданные последовательности из базы данных, прежде чем вставлять и затем использовать ключи вручную. Но у JDBC нет getTheNextFutureKeys(howMany). Так как это можно сделать? Тянет ключи, например в Oracle также транзакции сохраняются? Таким образом, только одна транзакция может получить один и тот же набор будущих ключей.

  2. Добавить дополнительный столбец с поддельным идентификатором, который действителен только во время транзакции.

  3. Использовать все остальные столбцы в качестве вторичного ключа для получения сгенерированного ключа. Это не совсем соответствует 3NF ...

Есть ли лучшие идеи или как я могу использовать идею 1 в обобщенном виде?

Ответы [ 3 ]

2 голосов
/ 29 августа 2011

Частичный ответ

Является ли извлечение ключей, например, в Oracle, сохранением транзакций?

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

Таким образом, вы можете предварительно выбрать идентификаторы из последовательности и использовать их в пакетной вставке.

1 голос
/ 29 августа 2011

Никогда не сталкивайтесь с этим, поэтому я немного погрузился в это.Прежде всего, - это способ получения сгенерированных идентификаторов из оператора JDBC:

String sql = "INSERT INTO AUTHORS (LAST, FIRST, HOME) VALUES " +
               "'PARKER', 'DOROTHY', 'USA', keyColumn";

int rows = stmt.executeUpdate(sql, 
               Statement.RETURN_GENERATED_KEYS);

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
         ResultSetMetaData rsmd = rs.getMetaData();
         int colCount = rsmd.getColumnCount();
         do {
             for (int i = 1; i <= colCount; i++) {
                 String key = rs.getString(i);
                 System.out.println("key " + i + "is " + key);
             }
         }
         while (rs.next();)
} 
else {
         System.out.println("There are no generated keys.");
}

смотри это http://download.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/statement.html#1000569

Также теоретически этов сочетании с JDBC batchUpdate

Хотя эта комбинация выглядит довольно нетривиальной, по этому вопросу обращайтесь к этой теме.Я рекомендую попробовать это, и если у вас ничего не получится, вернитесь к предварительной выборке из последовательности.

0 голосов
/ 29 августа 2011

getAutogeneratedKeys() также будет работать с пакетным обновлением, насколько я помню.

Возвращает ResultSet со всеми вновь созданными идентификаторами, а не только с одним значением.

Но для этого необходимо, чтобы идентификатор заполнялся через триггер во время операции INSERT.

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