Создать уникальный ключ в Java для использования в качестве первичного ключа в таблицах Oracle - PullRequest
0 голосов
/ 19 ноября 2009

Я пытаюсь получить строку длиной 15 для использования в качестве первичного ключа в таблицах базы данных. Следующий код в Java возвращает некоторый ключ длиной 35

UUID.randomUUID().toString()
  1. Могу ли я изменить его, чтобы он возвращал ключ длиной 15?
  2. Как обеспечить безопасность резьбы?

Любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 19 ноября 2009

Почему бы вам не воспользоваться средством Oracle sequence? Вы не можете сделать что-то лучше / безопаснее, используя Java.

Редактировать: Таким образом, ваша главная задача - производительность базы данных. Вы не хотели подключаться «снова», чтобы получить сгенерированный идентификатор из базы данных. Эта проблема не нужна, если вы просто используете пул соединений и просто повторно используете то же соединение, чтобы немедленно получить сгенерированный ключ. Большинство драйверов JDBC могут вернуть вам сгенерированный ключ на Statement#getGeneratedKeys(). Более новые драйверы JDBC Oracle поддерживают его.

Вот базовый пример:

Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet generatedKeys = null;

try {
    connection = database.getConnection();
    preparedStatement = connection.prepareStatement("INSERT INTO user (name, age) VALUES (?, ?)";
    preparedStatement.setString(user.getName());
    preparedStatement.setInteger(user.getAge());
    int affectedRows = preparedStatement.executeUpdate();
    if (affectedRows == 0) {
        throw new DAOException("Creating user failed, no rows affected.");
    }
    generatedKeys = preparedStatement.getGeneratedKeys();
    if (generatedKeys.next()) {
        user.setId(generatedKeys.getLong(1)); // Here's the magic.
    } else {
        throw new DAOException("Creating user failed, no generated key obtained.");
    }
} catch (SQLException e) {
    throw new DAOException(e);
} finally {
    close(connection, preparedStatement, generatedKeys);
}
0 голосов
/ 19 ноября 2009

Если вам действительно нужно сгенерировать свои собственные ключи, вы можете попробовать JUG . Вы специально попросили строки длиной 15 - JUG не может дать вам это. Я не уверен, почему это так важно, поэтому, если все, что вас действительно волнует, это уникальность, UUID являются 128-битными (если я правильно помню) и отображаются в шестнадцатеричном формате при форматировании строки.

0 голосов
/ 19 ноября 2009

randomUUID () создает не реальный UUID (основанный на времени, узле и т. Д.), А псевдослучайное значение. Предполагая, что случайность достаточна, вы должны иметь возможность выбрать любые 15 символов из UUID из 35 символов, чтобы создать случайное число - менее сильное по сравнению с UUID, но, возможно, достаточное.

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

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