Я запускаю приложение весенней загрузки, работающее под управлением 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