生成Java中的唯一键以用作Oracle表中的主键

时间:2009-11-19 13:23:44

标签: java thread-safety primary-key

我正在尝试获取一个长度为15的字符串,以用作数据库表中的主键。 java中的以下代码返回一些长度为35的键

UUID.randomUUID().toString()
  1. 我可以更改它以返回长度为15的键吗?
  2. 如何确保线程安全?
  3. 非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

为什么不使用Oracle的sequence工具?使用Java,你无法做得更好/更安全。

编辑:您主要关心的是数据库性能。您不想再次“连接”以从数据库中获取生成的ID。如果您只使用连接池并且只是重复使用相同的连接来立即获取生成的密钥,则不需要这种担忧。大多数JDBC驱动程序可以通过Statement#getGeneratedKeys()为您提供生成的密钥。 Oracle的新JDBC驱动程序支持它。

这是一个基本的例子:

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);
}

答案 1 :(得分:0)

randomUUID()不会创建真实的UUID(基于时间,节点等),而是伪随机值。假设,随机性足够,你应该能够从35个字符UUID中选择任何15个字符来创建一个随机数 - 与UUID相比不那么强但可能是足够的。

要真正防止冲突,您需要维护序列生成器。如果你不想使用oracle,也许基于文件的序列生成器是否足够? (下一个可用的序列号在使用之前存储在配置文件中)

答案 2 :(得分:0)

如果您确实需要生成自己的密钥,可以尝试JUG。你特意要求长度为15的字符串 - JUG不能给你这个。我不确定为什么这很重要所以假设您真正关心的是唯一性,UUID是128位(如果我没记错的话),并且在字符串格式化时以十六进制显示。