【发布时间】:2018-03-05 15:58:26
【问题描述】:
我们正在使用以下技术设计 API Rest:
- spring-boot 1.5.7
- spring-data-jpa
- MySQL 5.5.59
这是一个带有 spring-boot 的 Java REST API 设计,并通过 mysql-connector 连接到 MySQL 数据库。存储库中的大多数查询都是用 JPA Query 方式编写的。 为了编译它,我们使用 maven 并将其部署在运行在 tomcat 服务器中的 fatjar 中。
事实上,对于一个用户来说,其中的多个表和资源可能非常大。所以当 GET 请求的偏移量较大时,我们可以处理慢查询。
我们尝试了几种解决方案,例如:
- 设置 mysql 连接的 tomcat 参数
- 使用 hikari 但没有可用参数来终止慢查询
- 在 glassfish5 服务器中部署其余 api,但 spring data jpa 查询会引发 execption(无法提取结果集),所以这是个问题。
此外,很多人会说我“使用分页并检查请求中的偏移量”。事实是我们正在使用它,但是类 PageRequest 有一个棘手的行为。实际上,API 通过此类返回给您的资源具有以下形状:
{
"content": {},
"links": [
{
"href": "string",
"rel": "string",
"templated": true
}
],
"page": {
"number": 0,
"size": 0,
"totalElements": 0,
"totalPages": 0
}
}
如您所见,您有一个带有字段 totalElements 的对象 page。如果一个用户的表中有很多条目,这就是问题所在。因为 spring data 会做一个“SELECT COUNT(*)”来获得这个 totalElements 信息。分页不是解决方案,因为我们已经有了。
所以我们要问的是最佳实践,也许是在使用 spring-boot 的 Restful API 设计中处理和终止慢查询的解决方案。
谢谢!
【问题讨论】:
-
REST API 应该是无状态的。理论上这意味着它不应该保持会话状态或管理查询执行时间。
-
@RaymondNijland 是的,我同意,但是如果您的 API 是无状态的并且您在一个非常大的表上执行 GET 请求,mysql 将面临一个缓慢的查询,这对您的良好行为不利整个应用程序。因此,不是rest api本身的问题,而是关于spring的最佳配置以及与mysql的连接。
-
有一个解决方案叫分页。
-
您提到了偏移量,这似乎是您请求的参数。如何验证该参数的值并拒绝偏移超出范围的请求?
-
@MateuszMrozewski 发布关于分页的编辑 ;)
标签: mysql spring performance hibernate spring-boot