[英]Why is just one of my spring entities taking over 5 seconds to query
我有一個Spring后端應用程序,該應用程序具有30多個實體,但是由於某種原因,該用戶對象永遠需要做任何事情。 僅檢索所有用戶(僅15位)就需要6秒鍾!! 最重要的是,
User user = new User();
超過100毫秒對我來說毫無意義。 我不知道是什么引起了這個問題。 以下是用戶模型和通過查詢所有用戶生成的一些sql。
@Entity
@Table(name = "tbluser")
@Immutable
public class User {
private int userId;
private String password;
private String company;
private String firstName;
private String lastName;
private String email;
private String userName;
private String phone;
private String address1;
private String address2;
private String country;
private String postal;
private Set<UserRole> roles;
private Integer isActive;
private String userFolder;
public User(){
this("new", "PASSWORD", "new", "new", "", 1, "", "", "", "", "", "");
}
public User(String userName, String password, String firstName, String lastName){
this(userName, password, firstName, lastName, "", 1, "", "", "", "", "", "");
}
public User(String userName, String password, String firstName, String lastName, Integer isActive){
this(userName, password, firstName, lastName, "", isActive, "", "", "", "", "", "");
}
public User(String userName, String password, String firstName, String lastName, String email, Integer isActive,
String company, String phone, String address1, String address2, String country, String postal
){
this.setUserName(userName);
this.setEmail(email);
this.setPassword(new BCryptPasswordEncoder().encode(password));
this.setFirstName(firstName);
this.setLastName(lastName);
this.setIsActive(isActive);
this.setCompany(company);
this.setPhone(phone);
this.setAddress1(address1);
this.setAddress2(address2);
this.setCountry(country);
this.setPostal(postal);
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Column(name = "username")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "password", updatable = false)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name = "company")
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Column(name = "firstname")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(name = "lastname")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Column(name = "email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Column(name = "phone")
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Column(name = "address1")
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
@Column(name = "address2")
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
@Column(name = "country")
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Column(name = "postal")
public String getPostal() {
return postal;
}
public void setPostal(String postal) {
this.postal = postal;
}
@Column(name = "user_folder")
public String getUserFolder() {
return userFolder;
}
public void setUserFolder(String userFolder) {
this.userFolder = userFolder;
}
@Column(name = "isactive")
public Integer getIsActive() {
return isActive;
}
public void setIsActive(Integer isActive) {
this.isActive = isActive;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "tbluserrolemap", joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
public Set<UserRole> getRoles() {
return roles;
}
public void setRoles(Set<UserRole> roles) {
this.roles = roles;
}
}
這是生成的sql以及用戶角色的一些聯接。 它應該熱切地加載,但是即使用戶數量也不多,也應該不會有太大的不同。
Hibernate: select user0_.userId as userId1_63_, user0_.address1 as address2_63_, user0_.address2 as address3_63_, user0_.company as company4_63_, user0_.country as country5_63_, user0_.email as email6_63_, user0_.firstname as firstnam7_63_, user0_.isActive as isActive8_63_, user0_.lastname as lastname9_63_, user0_.password as passwor10_63_, user0_.phone as phone11_63_, user0_.postal as postal12_63_, user0_.user_folder as user_fo13_63_, user0_.username as usernam14_63_ from tbluser user0_ Hibernate: select roles0_.user_id as user_id1_64_0_, roles0_.role_id as role_id2_64_0_, userrole1_.role_id as role_id1_3_1_, userrole1_.name as name2_3_1_ from tbluserrolemap roles0_ inner join tbluserroles userrole1_ on roles0_.role_id=userrole1_.role_id where roles0_.user_id=? Hibernate: select roles0_.user_id as user_id1_64_0_, roles0_.role_id as role_id2_64_0_, userrole1_.role_id as role_id1_3_1_, userrole1_.name as name2_3_1_ from tbluserrolemap roles0_ inner join tbluserroles userrole1_ on roles0_.role_id=userrole1_.role_id where roles0_.user_id=? Hibernate: select roles0_.user_id as user_id1_64_0_, roles0_.role_id as role_id2_64_0_, userrole1_.role_id as role_id1_3_1_, userrole1_.name as name2_3_1_ from tbluserrolemap roles0_ inner join tbluserroles userrole1_ on roles0_.role_id=userrole1_.role_id where roles0_.user_id=?
CREATE TABLE `tbluser` ( `userId` int(11) NOT NULL AUTO_INCREMENT, `firstname` varchar(45) NOT NULL, `lastname` varchar(45) NOT NULL, `email` varchar(100) NOT NULL, `password` varchar(100) NOT NULL, `username` varchar(45) DEFAULT NULL, `phone` varchar(45) DEFAULT NULL, `address1` varchar(45) DEFAULT NULL, `address2` varchar(45) DEFAULT NULL, `country` varchar(45) DEFAULT NULL, `postal` varchar(45) DEFAULT NULL, `isactive` int(8) DEFAULT NULL, `company` varchar(45) DEFAULT NULL, `user_folder` varchar(45) DEFAULT NULL, PRIMARY KEY (`userId`) ) CREATE TABLE `tbluserrolemap` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `role_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_roleid_idx` (`role_id`), KEY `fk_userid_idx` (`user_id`), CONSTRAINT `fk_roleid` FOREIGN KEY (`role_id`) REFERENCES `tbluserroles` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_userid` FOREIGN KEY (`user_id`) REFERENCES `tbluser` (`userId`) ON DELETE NO ACTION ON UPDATE NO ACTION ) CREATE TABLE `tbluserroles` ( `role_id` int(11) NOT NULL, `name` varchar(45) DEFAULT NULL, PRIMARY KEY (`role_id`) )
原來是我覆蓋了用戶實體的空構造函數。 顯然,Spring確實不喜歡這樣。 刪除了該內容,並在10毫秒內執行了調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.