【问题标题】:How to hold multi request if it comes at a same time in Spring Boot?如果在 Spring Boot 中同时出现多个请求,如何保持?
【发布时间】:2018-07-09 10:16:25
【问题描述】:

我正在使用 Spring Boot,我的应用程序基于 日期和时间 运行。问题是,如果一个请求来自 jsp 页面,我必须循环来自 jsp 页面的 json 对象并将这些值保存在 db 中。对于一个请求,表中将有 6 个插入。因此,如果有 n 个请求,则 n*6 插入。

但如果所有请求同时出现(在特定时间甚至毫秒都相同),我需要的是,应该有 时间实验室 请求之间(至少以毫秒为单位)。现在,如果多个请求同时出现,它不会显示任何时间间隔。 Spring Boot 使用线程。我尝试使用“单例”。但它不起作用。我不擅长单例设计,但我参考了一些教程。我使用递归函数为每个请求创建新时间。

  • 单例:只创建一个实例(默认范围)
  • prototype:每次引用原型 bean 时都会创建新实例。
  • 请求:单个 HTTP 请求的一个实例。
  • 会话:HTTP 会话的一个实例

控制器类

@RequestMapping(value = "/save", method = RequestMethod.GET)
public String saveCategory(@ModelAttribute("gaugeForm") Gauge gauge, @RequestParam(value = "values") String json)
{
    //makeing json to List using ObjectMapper

    LocalDateTime now = LocalDateTime.now();
    String nowDateTime =checkDateTime(now.toString()); // checking and getting if the date and time already exists in db using recursive function.

    //A simple example what I do.   
    for (int i = 0; i < list.size(); i++) {
        gauge.setName(i);
        gauge.setDatetime(nowDateTime ) // now dateTime
        gaugeService.saveOrUpdate(gauge);
    }
}

实体类

@Entity
@Table(name = "gauge")
@Proxy(lazy = false)
@Scope(value = "singleton") // try to create an instance at a time
public class Gauge {
    private String name;
    private String datetime;

    //constructors, gettters and setters
}

递归函数

public String checkDateTime(String dateTime) {
    if (gaugeService.isDateTimeInDB(dateTime)) {
        LocalDateTime now = LocalDateTime.now();
        return checkDateTime(now.toString());
    } else {
        return dateTime;
    }
}

下图显示了我的具体需求。前 6 个插入(第一个请求)在时间上相同,接下来的 6 个插入(第二个请求)在时间上相同但与第一个不同。

总结:保留所有请求,直到一个请求保存在数据库中。

如果我的方法有误,请告诉我任何其他方法。

【问题讨论】:

  • 你为什么需要它?用于处理请求的线程池已经限制传入请求。除非您想按传入顺序处理您的请求
  • @varman 你为什么不在数据库端处理这个使用隔离和传播的事务。锁定表或行,然后为下一个请求处理新事务。
  • @MạnhQuyếtNguyễn 我需要它来处理不同的 sql 命令
  • @mallikarjun 我刚刚看了一些教程,@Transactional(propagation=Propagation.REQUIRES_NEW) 可以帮我吗?
  • @varman google 和 here 简单的开始。

标签: java spring spring-mvc spring-boot singleton


【解决方案1】:

您可以在客户端添加一个唯一的 uuid 并将其传递到这 6 个请求中,在服务器端您可以通过 uuid 键将它们放入映射中,并在收到所有 6 个请求后保存。

【讨论】:

  • 这可能是个好主意。控制器中有一个巨大的过程,我只是介绍了一点。但是如果来了很多请求,处理速度就会下降。有什么更聪明的主意吗?
  • 它是一个平台应用程序。所以我不能说会有多少RPS。另一个问题是,如果很少有人使用自己的电脑,我们可以保留请求吗?
【解决方案2】:

为什么不使用事务将请求序列化到数据库中,并使用递增字段作为伪时间戳或放宽 1 毫秒的标准?

通过使用事务,您可以保证请求将被串行存储,而不必担心控制器中的逻辑。

数据库很可能会写入内存中保存的页面(以及预写日志),因此我认为没有任何保证方法可以确保记录之间的时间间隔至少为 1 毫秒.

您可以做的最好的事情是在实际时间后面加上一个额外的“时间戳”(一些由数据库管理的自动递增字段)或使用“滴答”(而不是毫秒)和数据库时间(即数据库时间函数),而不是客户端时间。

【讨论】:

    猜你喜欢
    • 2018-02-23
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2021-11-22
    • 2021-09-19
    • 2021-03-06
    相关资源
    最近更新 更多