Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate数据库速度问题_Java_Hibernate_Spring Data Jpa_Jhipster - Fatal编程技术网

Java Hibernate数据库速度问题

Java Hibernate数据库速度问题,java,hibernate,spring-data-jpa,jhipster,Java,Hibernate,Spring Data Jpa,Jhipster,我使用Jhipster生成了应用程序。在开始时,一切都很好,但随着应用程序的增长,比赛实体成为性能方面的问题。 这是我的实体: /** * A Tournament. */ @Entity @Table(name = "tournament") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Document(indexName = "tournament") public class Tournament imp

我使用Jhipster生成了应用程序。在开始时,一切都很好,但随着应用程序的增长,比赛实体成为性能方面的问题。 这是我的实体:

/**
 * A Tournament.
 */
@Entity
@Table(name = "tournament")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "tournament")
public class Tournament implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "location")
    private String location;

    @Column(name = "url")
    private String url;

    @Column(name = "start_date")
    private ZonedDateTime startDate;

    @Column(name = "end_date")
    private ZonedDateTime endDate;

    @Column(name = "entry_fee")
    private Double entryFee;

    @Column(name = "prize")
    private Double prize;

    @Column(name = "goods")
    private String goods;

    @Column(name = "favorite_rating")
    private Long favoriteRating;

    @Column(name = "participants_number")
    private Integer participantsNumber;

    @Column(name = "finished")
    private Boolean finished;

    @Column(name = "view_only")
    private Boolean viewOnly;

    @Column(name = "image")
    private String image;

    @Column(name = "description")
    private String description;

    @Column(name = "teams_applied")
    private String teamsApplied;

    @Lob
    @Column(name = "schedule")
    private String schedule;

    @Lob
    @Column(name = "prize_distribution")
    private String prizeDistribution;

    @Lob
    @Column(name = "contacts")
    private String contacts;

    @Lob
    @Column(name = "rules")
    private String rules;

    @OneToMany(mappedBy = "tournament", fetch = FetchType.LAZY)
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Stream> streams = new HashSet<>();

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "tournament_platforms", joinColumns = @JoinColumn(name = "tournaments_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "platforms_id", referencedColumnName = "id"))
    private Set<Platform> platforms = new HashSet<>();

    @ManyToMany(mappedBy = "favoriteTournaments", fetch = FetchType.LAZY)
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<User> favoriteUsers = new HashSet<>();

    @ManyToOne
    private Game game;

    @ManyToOne
    private TournamentStatus status;

    @ManyToOne
    private EntryType entryType;

    @ManyToOne
    private TournamentFormat format;

    @ManyToOne
    private Region region;

    @ManyToOne
    private GameMode gameMode;

    @ManyToOne
    private PrizeType prizeType;

    @ManyToOne
    private Organizer organizer;

    @ManyToOne
    private TournamentStage stage;

    @ManyToOne
    private HostPlatform hostPlatforms;

    @ManyToOne
    private TournamentType type;

    @ManyToOne
    private PlayType playType;

    @ManyToOne
    private Currency currency;

    @ManyToOne
    private Country country;
/**
*比赛。
*/
@实体
@表(name=“锦标赛”)
@缓存(用法=缓存并发策略。非严格读写)
@文档(indexName=“锦标赛”)
公共类实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“sequenceGenerator”)
@SequenceGenerator(name=“SequenceGenerator”)
私人长id;
@列(name=“name”)
私有字符串名称;
@列(name=“location”)
私有字符串位置;
@列(name=“url”)
私有字符串url;
@列(name=“开始日期”)
专用分区日期开始日期;
@列(name=“结束日期”)
私有分区日期结束日期;
@列(name=“录入费”)
私人双入场费;
@列(name=“prize”)
私人双奖;
@列(name=“货物”)
私人物品;
@列(name=“最喜爱的评分”)
私人长期偏爱;
@列(name=“参与者编号”)
私有整数参与者数目;
@列(name=“finished”)
私有布尔完成;
@列(name=“仅查看”)
仅限私有布尔视图;
@列(name=“image”)
私有字符串图像;
@列(name=“description”)
私有字符串描述;
@列(name=“已应用的团队”)
私用字符串组;
@高球
@列(name=“附表”)
私有字符串调度;
@高球
@列(name=“奖品分配”)
私人字符串分配;
@高球
@列(name=“contacts”)
私人字符串联系人;
@高球
@列(name=“rules”)
私有字符串规则;
@OneToMany(mappedBy=“tournament”,fetch=FetchType.LAZY)
@杰索尼奥雷
@缓存(用法=缓存并发策略。非严格读写)
私有集流=新的HashSet();
@许多
@缓存(用法=缓存并发策略。非严格读写)
@JoinTable(name=“tournaments\u platforms”,joinColumns=@JoinColumn(name=“tournaments\u id”,referencedColumnName=“id”),inverseJoinColumns=@JoinColumn(name=“platforms\u id”,referencedColumnName=“id”))
私有集平台=新HashSet();
@ManyToMany(mappedBy=“favoriteTournaments”,fetch=FetchType.LAZY)
@杰索尼奥雷
@缓存(用法=缓存并发策略。非严格读写)
私有集favoriteUsers=新HashSet();
@许多酮
私人游戏;
@许多酮
私人锦标赛状态;
@许多酮
私有入口类型入口类型;
@许多酮
私人锦标赛格式;
@许多酮
私人区域;
@许多酮
私人游戏模式;
@许多酮
私有PrizeType PrizeType;
@许多酮
私人组织者;
@许多酮
私人比赛阶段;
@许多酮
专用主机平台主机平台;
@许多酮
私人锦标赛类型;
@许多酮
私人游戏类型;
@许多酮
私人货币;
@许多酮
私人国家;

我使用的是spring JPA。从数据库中获取20场比赛需要39秒。这是不可接受的。我有没有办法将其降低到正常速度。响应时间这么长的原因是什么?在hibernate的JPA实现中,我创建的每一个多对一关系中,
@ManyToOne
都有一个
fetchType=EAGER
默认情况下,您有14个

@ManyToOne
private Country country;
这意味着每个请求都有14个连接。我强烈建议对所有关系使用
fetchType=LAZY
,并在需要时逐个停用它们

根据经验,每个请求不应使用超过3个联接


另外,请查看生成的请求,并使用
解释计划
,以了解数据库的实际功能和成本。它可能会显示用作外键的列上缺少的索引…

您是否直接对数据库执行过相同的查询?可能不仅仅是hibernate的问题。此外,还将加载大量的直接依赖项,这可能会导致巨大的对象。此外,您还应该真正考虑
延迟加载
每个依赖项的“正常速度”?我在您的对象中计算了15个联接-我是否遗漏了任何联接?这是查询引擎要做的大量工作。我的建议是对您的架构进行非规范化,以查看性能是否有所提高,并且不要使用JPA。手动编写SQL。当黑框让您失望时,它们会出现问题。更不用说潜在的嵌套联接显示我可以使用EXPLAIN PLAN吗如果我需要它们都是什么?@ USSR36364181通常,你不需要它们全部。我怀疑你不需要<代码>区域< /C> >和<代码>国家< /代码>,例如,考虑使用,以便建立你的请求,只选择你真正需要的。总是使用<代码> FutCHyType懒惰< /代码>。你可以在查询中使懒惰关系变得急切。(例如,
JOIN-FETCH
),但你不能让渴望的关系变得懒惰。