我们正在针对现有数据库编写新的应用程序。我正在使用Spring Data JPA,只是做一个
MyRepository.save()
在我的新实体上,使用
MyRepository extends CrudRepository<MyThing, String>
我在日志中注意到,在插入之前,hibernate正在执行Select,并且即使查询使用主键或索引,它们也需要很长时间。我之前发布了一个问题,询问如何在插入之前停止SELECT。没想出来。现在我只想弄清楚为什么这么长时间。
我有日志集,所以我可以看到hibernate生成的sql。在一个示例中,根据记录定时,该查询花费大约4秒。这个用主键查询。当我运行在数据库工具(如dbvisualizer)中生成的hibernate的sql时,它会在亚秒内返回,正如我所期望的那样。
我将hibernate打包日志记录增加到TRACE级别,尝试查看延迟的位置,并在4秒延迟之前和之后找到以下内容:
2017-08-11 13:45:40.099 TRACE 16136 --- [nio-8085-exec-1] o.h.l.p.e.i.AbstractLoadPlanBasedLoader : Bound [2] parameters total
2017-08-11 13:45:44.023 TRACE 16136 --- [nio-8085-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl : Registering result set [SQLServerResultSet:6]
我也想知道为什么它说2个参数绑定,当sql中只有1个。
为什么这些选择花了这么长时间?特别是只在我的春季应用程序中,而不是像dbvisualizer这样的另一个客户端?
编辑:添加更多细节,sql,实体代码
请注意,此示例只是查找现有实体;这不是我们正在进行插入的表之一,而Hibernate在INSERT之前正在执行额外的SELECT,但看起来延迟是相同的。这个需要4秒钟。
这是生成的sql:
select customer0_.customer_id as customer1_4_0_, customer0_.first_name as first_na2_4_0_, customer0_.last_name as last_nam3_4_0_ from my_customer_table customer0_ where customer0_.customer_id=?
这是实体:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "my_customer_table")
public class Customer {
@Id
private String customer_id;
private String first_name;
private String last_name;
protected Customer() {}
public Customer(String firstName, String lastName) {
this.first_name = firstName;
this.last_name = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%s, firstName='%s', lastName='%s']",
customer_id, first_name, last_name);
}
}
这是CustomerRepository
import com.....Customer;
import org.springframework.data.repository.CrudRepository;
public interface CustomerRepository extends CrudRepository<Customer, String> {
}
以及从@Service所在的@Service类中查找Customer的代码:
Customer customer = customerRepository.findOne(customerId);