Я запускаю два вызова INSERT sql один за другим с помощью Statement.RETURN_GENERATED_KEYS, каждая вставка имеет свой собственный уникальный идентификатор, назначенный ей.
Каждый вызов генерируется с помощью connection.prepareStatement, где соединение может повторно использоваться разными потоками (пул соединений или встроенная база данных - в любом случае это одна и та же проблема).
Итак, когда я делаю:
result = preparedStatement.getGeneratedKeys();
result.next();
return result.getInt(1);
Число, которое возвращается, похоже, не является потокобезопасным!! Обычно он захватывает сгенерированный идентификатор из первого пройденного потока.
В основном, если я запускаю несколько потоков, INSERTS работает нормально, но затем, пытаясь получить автоматически сгенерированный уникальный идентификатор, он возвращает тот же идентификатор. Опять же, я подозреваю, что это связано с тем, что соединение является общим, и как я это делаю
connection.prepareStatement(sqlString, Statement.RETURN_GENERATED_KEYS);
Я вижу, что есть ряд альтернативных параметров, но я с ними не знаком. Как я могу каким-то образом гарантировать, что каждый подготовленный оператор позже вернет свой собственный уникальный автоматически сгенерированный идентификатор?
ОБНОВЛЕНИЕ: Похоже, это происходит только со встроенным драйвером базы данных derby...