我目前正在使用PostgreSQL数据库,Spring和Hibernate。我有一个表的属性correlation_id是唯一的。每次在我首先添加一个新元素之前,我必须检查任何具有新的correlation_id的项目是否已经存在于数据库中。在数据库和内存中搜索数据时的性能
对于这种情况,我已经实现了递归函数,它将生成一个新的correlation_id并检查它是否存在或不在db中。这意味着这个函数每次都会调用db,所以有时候可能只是一次调用,但有时我可能会是五次,十次甚至更多。这个例子在示例一中显示。
例1:
private String generateId() {
String myId = StaticFunction.generateMyId();
MyMessages doesExist = MyServiceDaoImpl.checkDoesItExistInDB(myId);
if(doesExist != null) {
generateId();
}
return myId;
}
在第二个例子,我想我可以只创建一个调用数据库和检索所有项目,并把它们放到收集。然后我可以通过流来搜索特定的物品,同时使用递归功能。 例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;
}
我的问题是什么是让这件事情吧,最好的办法?你有其他解决方案吗?以上例子的优点和缺点是什么?
你为什么不使用数据库生成的ID –
和第三选择是刚插入任何和失败的重复键 –
@ScaryWombat我不使用,因为某些原因产生的ID correlation_id有时可以为null,并且我还需要一些项目以包含null作为correlation_id –