Java Hibernate数据库速度问题
我使用Jhipster生成了应用程序。在开始时,一切都很好,但随着应用程序的增长,比赛实体成为性能方面的问题。 这是我的实体: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
/**
* 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
),但你不能让渴望的关系变得懒惰。