2009-11-19 2 views
0

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

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

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

+0

Просьба подробно рассказать о контексте. Для чего вам это нужно? Почему вы уменьшаете уникальность, ограничивая размер? Таким образом, мы можем дать более подходящий ответ/предложение. – BalusC

+0

UUID - это определенный стандарт, содержащий фиксированный набор информации, содержащийся внутри. Вы не можете получить его в 15 символов, так как информация не будет соответствовать 15 символам. – skaffman

+0

Почему длина должна быть 15? Будет ли уникальность достаточна или у вас есть какое-то другое ограничение? – monorailkitty

ответ

1

Почему вы не используете средство 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

Последовательности могут быть сброшены, преднамеренно или случайно, что приведет к нарушениям. Однако рандомизированные UUID никогда не будут сталкиваться. – skaffman

+0

Я устанавливаю значение первичного ключа в своем приложении java, чтобы использовать последовательность oracle. Мне нужно будет подключиться к БД, что для меня немного накладно, поскольку мы преследуем проблемы с производительностью. Я ищу что-то вроде UUID, но с длиной 15 –

+0

Это правда, но я бы не стал тесно связывать контроль над ПК. БД теперь не переносима. Однако окончательный/правильный ответ также зависит от контекста вопроса, я попросил ОП разъяснить. – BalusC

0

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

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

+0

ОК - вы предотвращаете столкновения только для первых 10^15-1 записей, но я думаю, что не плохо для начала;) –

0

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