【发布时间】:2017-12-25 19:20:04
【问题描述】:
我目前正在使用 PostgreSQL 数据库、Spring 和 Hibernate。我有一张表,其中属性correlation_id 是唯一的。每次在我首先添加一个新元素之前,我都必须检查数据库中是否已经存在任何具有新相关 ID 的项目。
对于这种情况,我已经实现了递归函数,它将生成一个新的 correlation_id 并检查它在 db 中是否存在。这意味着这个函数每次都会在 db 上进行调用,所以有时它可能只是一个调用,但有时我可能是五个、十个甚至更多。此示例如示例一所示。
示例 1:
private String generateId() {
String myId = StaticFunction.generateMyId();
MyMessages doesExist = MyServiceDaoImpl.checkDoesItExistInDB(myId);
if(doesExist != null) {
generateId();
}
return myId;
}
在第二个示例中,我假设我可以只创建一个对 db 的调用并检索所有项目并将它们放入集合中。然后我可以通过流来搜索使用递归函数的特定项目。 例 2:
private String generateId(List<MyMessages> messages) {
String myId = StaticFunction.generateMyId();
MyMessages myMessage = messages.stream().filter(m ->
m.getCorrelationId.equals(myId)).findFirst().orElse(null);
if (MyMessages != null) {
generateId(messages);
}
return myId;
}
我的问题是使这件事正确的最佳方法是什么?您还有其他解决方案吗?以上例子的优缺点是什么?
【问题讨论】:
-
为什么不用db生成的id
-
第三个选项就是插入任何重复键并失败
-
@ScaryWombat 我不使用生成的 id,因为某种原因,correlation_id 有时可能为空,而且我还需要一些项目包含相关 ID 的空
-
如果你有另一个id和correlation_id,你可以选择是否将唯一值从
id复制到correlation_id -
另一个取决于您的负载的选项是将当前时间用作毫秒
标签: java spring postgresql performance hibernate