【发布时间】:2022-01-16 02:32:20
【问题描述】:
我有一个运行 Spring boot + JPA + Hibernate 的服务器。我正在使用 MySQL 数据库(默认使用 InnoDb 引擎)。 该实现从我在 Internet 上搜索的许多文章中汲取灵感。 我已经实现了 REST API 来促进动态构建网站。 我想将所有 API 请求记录到日志(审计日志)中。所以当API被调用时, 我将请求方法名称和一些参数存储到 MySql 的审计日志表中。 就在我从 API 返回之前,我还通过更新相同的记录来存储响应。
当我使用 Web 应用程序客户端和 Postman 发出 API 请求时,我正在查看 Hibernate 的代码日志。 我注意到对于每个 API,插入和更新平均需要 150 毫秒到 200 毫秒。 事实证明,这对于获取的信息非常少的 API 来说代价高昂。
所以我想知道如何加快插入速度,使我的插入/更新时间少于 10 -20 毫秒。
我的 Auditlog 实体是
@Entity
@Table(name="auditlog")
public class AuditLog{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
private Date created_at;
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate
private Date updated_at;
@NotBlank
private String methodName;
private String param1;
// Text field with private information like password masked
@Column(length = 65535, columnDefinition = "text")
private String request;
// Text field
@Column(length = 65535, columnDefinition = "text")
private String response;
private Integer result;
... // getters and setters
}
我的 AuditLogRepository 是:
public interface AuditLogRepository extends JpaRepository<AuditLog, Long>{
}
在我的 REST API 控制器中,我正在执行以下操作
...
AuditLog logEntry = new AuditLog();
// set all the values except generated ones like id, created_at and updated_at
logEntry.setMethodName(...);
logEntry.setParam1(...);
logEntry.setRequest(...);
// Save into the table using autowired repoitory
auditLogRepoitory.saveAndFlush(logEntry);
// ... do the operation of the API
// Update the logEntry
logEntry.setResult(...);
logEntry.setResponse(...);
auditLogRepoitory.saveAndFlush(logEntry);
...
请帮助我改进对表格的插入和更新。 或者请帮助改进代码,以便我可以更快地响应 API。
谢谢, 斯里普拉德
【问题讨论】:
-
那是多少个插入?磁盘:HDD 还是 SSD?
-
请提供生成的SQL。一方面,我无法跟上一百个向开发人员隐藏 MySQL 的框架。
标签: mysql spring-boot hibernate jpa