如果同时出现多个请求,如何保存-春季启动

时间:2018-07-09 10:16:26

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

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

但是,如果所有请求都在同一时间发出( 在特定时间甚至是毫秒数 ),我需要的是,应该有时间实验室之间的请求(至少以毫秒为单位)。 现在,如果同时出现多个请求,它不会显示任何时间间隔。 Spring Boot使用线程。我尝试使用“ 单人”。但这是行不通的。我对Singleton的设计不好,但是我只介绍了一些教程。我使用递归函数为每个请求创建新时间。

  
      
  • 单例:仅创建一个实例(默认范围)
  •   
  • 原型:每次引用原型bean时都会创建一个新实例。
  •   
  • request:单个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个插入(第二个请求)的时间相同,但与第一个不同。

This is an example what I need

摘要:保留所有请求,直到一个请求保存到数据库中

我在这里面临一个重大问题,请任何人帮助我实施。如果我的方法有误,请让我知道其他方法。预先感谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

数据库很可能将写入存储在内存中的页面(以及预写日志),所以我认为没有任何保证的方法可以确保两次记录之间的间隔至少为1毫秒。

您能做的最好的事情是在实际时间后缀一个额外的“时间戳”(某些由数据库管理的自动递增字段),或者在数据库时间(例如数据库TIME)中加上“滴答”(而不是毫秒)功能),而不是客户时间。