postgresql - Hibernate / Spring Data插入没有选择+如果不存在复合键则插入
问题描述
我在 Spring Data JPA 2.5.5 / Hibernate 5.4.32 / PostgreSQL 12.7.0 下。
我有一个数据库表“A”,主要有两个用例:
- 将大量新数据(日期时间方面的新数据)添加到“A”中(每分钟至少 100 万条)
- 填充旧数据的空白间隔(就日期时间而言是旧的),同样每分钟可能有 100 万条记录:这意味着如果不存在则插入,输入数据中已经存在数据
我有以下架构:
@Embeddable
public class TableId implements Serializable {
@Column(name = "datetime", nullable = false)
private OffsetDateTime datetime;
@Column(name = "data")
private String data;
(getters/setters...)
}
@Entity
@Table(name = "\"A\"")
public class AEntity implements Persistable<TableId> {
@EmbeddedId
private TableId id;
@Column(name = "value")
private Double value;
@Override
public boolean isNew() {
return true;
}
(getters/setters...)
}
该isNew()
方法允许修复第一种情况,这意味着在插入时不进行任何选择。这是最好的方法吗?
现在对于第二点,我不知道在性能方面最好的方法是什么,有什么建议吗?
我发现了这一点,但正如预期的那样慢:
@Query(nativeQuery = true, value = "select * from A a where CONCAT(cast(a.datetime as VARCHAR), '-', a.data) in (:columns)")
List<AEntity> findByIdIn(@Param("columns") List<String> columns);
请注意,我不能在数据库中添加额外的列,并且该表包含数十亿条记录。
解决方案
推荐阅读
- octopus-deploy - Octopus Deploy - 使用索引从数组中选择对象
- netbeans-plugins - 我在 Ubuntu 上的 Netbeans 12.2 只有轻量级的临时 C++ IDE,找不到真正的
- angular - 使用单独的模板清洁 Angular 11 组件继承架构
- c++ - 强制 C++ 优先使用带有隐式转换而不是模板的重载
- python - 如何在pysparkml中处理具有大量唯一值的分类特征
- javascript - 通过 JavaScript 删除 JSON 数据
- python - 递归超过时间限制,适用于 90/91 测试用例,在大输入时失败
- neo4j - 什么决定了节点名称在 Neo4j 中的显示方式?
- python - Pandas read_csv 与数据推断不一致
- python - 如何跳过一些使用 Beautiful Soup 的文本?