JDBC / Postgres快速时,JPA / HIbernate查询非常慢

时间:2019-06-27 00:32:52

标签: java postgresql hibernate jpa spring-data-jpa

我正在运行在Heroku上运行Hibernate 5.4.2和Postgresql 42.2.2 DB的Spring Boot应用程序。

我正在使用JPARepository的默认findAll()方法来选择整个表。大约有50个实体,大约需要35秒。当我使用Heroku CLI在同一台计算机上通过终端运行全选查询时,查询将在约130毫秒内完成。

我一直在尝试使用JProfiler查明问题所在。通过JProfiler查看查询时,我注意到相关的JDBC调用大约需要140毫秒,这与Heroku CLI差不多。但是查询本身仍然需要35秒...

我已打开休眠登录,并确保没有其他查询正在发送。另外,我尝试运行相同的查询,以支持H2数据库支持我的应用程序。查询在不到一百毫秒的时间内返回。

请参见JProfiler查询时间https://i.stack.imgur.com/tAKwf.png

我的实体非常简单。与其他类没有任何关系,因此我认为它不是n + 1查询问题。

@Entity
@Table(name = "event")
@NoArgsConstructor
@Getter
@ToString
@EqualsAndHashCode(callSuper = true)
public class SqlEvent extends SerializedObjectRecord {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id", updatable = false, nullable = false)
    @NonNull
    private Long id;

    @Column(nullable = false)
    @NonNull
    private String name;

    @Column(nullable = false)
    @NonNull
    private UUID uuid;

    @Column(nullable = false)
    @NonNull
    private UUID sqlCommandUuid;

    @Column(nullable = false)
    @NonNull
    private Instant timestamp;

    @Column(nullable = false)
    @NonNull
    private String avroSchemaFingerprint;

我的服务等级

    @Override
    @Timed(value = "service")
    public Collection<Pair> getAll(UUID commandId) {

    long start = System.nanoTime();

    List<SqlEvent> list = this.sqlEventRepository.findAll();
    long end = System.nanoTime();
    long duration = (end - start) / 1000000; #duration takes ~35000ms like Jprofiler says

    return convert(list);
}


  [1]: https://i.stack.imgur.com/tAKwf.png

0 个答案:

没有答案