java – Hibernate:每个月自动拆分表

前端之家收集整理的这篇文章主要介绍了java – Hibernate:每个月自动拆分表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在研究一个带有Postgresql和Hibernate的 Spring-MVC应用程序,其中我有几个表,行数超过10万(10万).这些表,我95%的时间只访问最新的数据,并筛选所有这些行是耗时的.很多时候查询规划器甚至没有使用索引(原因我不知道).

然后我想到每周拆分数据库表,所以我们可以先访问最新的月份数据库,然后如果用户请求,那么前一个表中的更多结果将直接添加到请求中.

执行的大多数查询都要求我们使用JOIN,因为表格是一对多映射的.

行计数为>的模型文件之一超过10万.

型号:

@Entity
@Table(name = "groupnotehistory")
public class GroupNoteHistory {

    @Id
    @Column(name = "mhistoryid")
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "mhistory_gen")
    @SequenceGenerator(name = "mhistory_gen",sequenceName = "mhistory_seq")
    private int mhistoryid;


    @Column(name = "mnoteeditdate",columnDefinition = "timestamp without time zone")
    private Timestamp mnoteEditDate;

    @Column(name = "oldheadline",columnDefinition = "character varying")
    @Type(type="jasyptHibernateEncryptor")
    private String oldHeadLine;

    @Column(name = "oldtext",columnDefinition = "character varying")
    @Type(type="jasyptHibernateEncryptor")
    private String oldText;

    @Column(name = "newnotetext",columnDefinition = "character varying")
    @Type(type="jasyptHibernateEncryptor")
    private String newNoteText;

    @Column(name = "newnoteheadline",columnDefinition = "character varying")
    @Type(type="jasyptHibernateEncryptor")
    private String newNoteHeadline;


@JsonIgnore
    @ManyToOne
    @JoinColumn(name = "mnoteid",nullable = false)
    private GroupNotes mhistory;
// Getters and setters

}

Hibernate是否提供了解决此问题的任何策略或方法?谢谢.

解决方法

如何将数据分成几个表,如:

>当前值(最多一周) – 表latest_values
>也是较旧的值(最多一年) – 表year_values
>所有值(完整历史记录) – 表all_values

始终插入latest_values并将规则推送到其他值.

每天或每周运行一个“DELETE FROM latest_values WHERE insert_date< CURRENT_DATE - 7”.每月运行“DELETE FROM year_values WHERE insert_date< CURRENT_DATE - 365”(闰年与此无关). 这样,您可以保持较小的表格,并且可以轻松地检索更多当前值,并且如果查询需要它们,仍然可以获得所有值. 每周拆分成一个单独的表(这就是我理解你的想法)会给你留下太多的表并且复杂 – 因此很慢 – 如果你需要数周的数据,UNION操作.

原文链接:https://www.f2er.com/java/129249.html

猜你在找的Java相关文章