JPA / HIbernate очень медленный запрос, в то время как JDBC / Postgres работает быстро - PullRequest
0 голосов
/ 27 июня 2019

Я запускаю приложение весенней загрузки, работающее под управлением Hibernate 5.4.2 и Postgresql 42.2.2 DB на Heroku.

Я использую метод findAll () по умолчанию в JPARepository, чтобы выбрать всю таблицу. Есть около 50 объектов, и это займет около 35 секунд. Когда я запускаю запрос на выборку с помощью интерфейса командной строки Heroku через терминал на том же компьютере, запрос завершается через ~ 130 миллисекунд.

Я пытался использовать JProfiler, чтобы точно определить проблему. Глядя на запрос через JProfiler, я замечаю, что связанный вызов JDBC занимает около 140 мс, что близко к CLI Heroku. Однако сам запрос все еще занимает 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
...