为什么在保存()之前Hibernate的选择需要这么长时间?

时间:2017-08-11 18:11:10

标签: java spring hibernate spring-data-jpa

我们正在针对现有数据库编写新的应用程序。我正在使用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);

0 个答案:

没有答案