我正在运行在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