我有一个在2列(user1和user2)上具有唯一约束的表,因此不能有任何重复的用户对。看起来像这样:
@Table(name = "relation", uniqueConstraints ={
@UniqueConstraint(columnNames = { "user1", "user2" })
})
class Relation{}
...
列user1
和user2
是uuid-char
的
当我从某个远端接收数据时,我得到了必须插入到表中的对的列表。这是我收到的列表:
{ user1: some-uuid, user2: some-other-uuid }
{ user1: some-uuid, user2: some-other-uuid }
{ user1: some-uuid, user2: some-other-uuid }
... + 1000 records
然后,我遍历该列表并插入所有对:
for(Pair p : data){
try{
relationRepository.save(p);
}
catch(PostgresConstraintViolationException ex){
log("Pair already exists, but that's ok")
}
}
我的问题是:
故意捕获ConstraintViolationException是否会对性能产生影响?这似乎比检查数据库中的对是否存在,如果不存在则插入要好得多。 (1个查询,而不是2个查询。)
我曾经听说过“这就是例外”。我了解这一点,但是我不确定Postgres在这种情况下的行为。
答案 0 :(得分:1)
就性能而言,插入并希望异常更好,因为对远程服务器的附加查询永远不会胜过简单的异常处理。但是,有时有些事情是数据库不知道的,并且您可能需要在插入数据之前执行查询或查询。根据个人经验,执行这些查询会更好,因为它们会使您的代码可读且易于理解。此外,异常有时是模棱两可的(对于SQLException),有时很难预测,这会导致浮动错误。
This是一篇非常不错的文章,您应该看看。