spring-data-jpa 是什么原因导致单个实体的休眠刷新需要很长时间?

inb24sb2  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(117)

背景
我使用Hibernate通过Spring Data JPA的save方法保存了一个实体。这个实体非常简单。它只是一个字段的集合。大小大约是30KB,主要是因为存在两个JSON字段。
表中的行数非常少,可能有一千行,因为我们还在开发阶段。没有索引。它是一个MySQL数据库。没有“相关”实体(如外键)。所有配置都是默认的。
问题所在
对于某些插入,需要花费很长时间:超过10秒。通常,这需要几毫秒。此数据的来源是Hibernate的统计日志。
日志看起来像这样。

org.hibernate.engine.internal.StatisticalLoggingSessionEventListener.end(StatisticalLoggingSessionEventListener.java:258) - Session Metrics {
906283 nanoseconds spent acquiring 1 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
179137263 nanoseconds spent preparing 1 JDBC statements;
4523687 nanoseconds spent executing 1 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
0 nanoseconds spent performing 0 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
17862368456 nanoseconds spent executing 1 flushes (flushing a total of 1 entities and 0 collections);
0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
}

我发现了两个棘手问题,如日志中所示。
1.准备JDBC语句所花费的时间
1.执行刷新所花费的时间
它永远是1个陈述式,而且永远会清除一个实体。
我的问题是,是什么原因导致操作在某些情况下花费如此长的时间(〉10秒),而在另一些情况下花费相当少的时间(〈10毫秒)?

kcugc4gi

kcugc4gi1#

我认为可能的原因如下:
1.网络/数据传输慢。对于一个实体,你要通过网络传输相当多的数据。这应该不会花那么长时间,但是如果数据库/网络负载很重或者没有足够的资源,我想这可能会发生。
1.锁。锁总是一个很好的候选人当事情需要太长的时间。但问题是:为什么要花18秒而不是永远。
1.转换。你创建了很多JSON。这需要额外的处理吗?
您应该检查数据库和数据库服务器的性能数字,还应该在应用程序上使用分析器,以便区分这三种可能的原因。

相关问题