Spring MVC 不断刷新数据库中的数据

9nvpjoqh  于 2022-12-19  发布在  Spring
关注(0)|答案(5)|浏览(169)

我想显示这个Spring VMC表:

@Controller
public class FileImportsController {

    private EntityImportRequestsService entityImportRequestsService;

    @Autowired
    public FileImportsController(EntityImportRequestsService entityImportRequestsService) {
        this.entityImportRequestsService = entityImportRequestsService;
    }

    @GetMapping("/imported_files")
    public String viewHomePage(Model model) {
        List<EntityImportRequestsTable> listProducts = entityImportRequestsService.findAll();
        model.addAttribute("listProducts", listProducts);
        return "index";
    }

}

页码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="utf-8"/>
  <title>Product Manager</title>
</head>
<body>
<div align="center">
  <h1>Product List</h1>
  <table border="1" cellpadding="10">
    <thead>
    <tr>
      <th>Product ID</th>
      <th>Name</th>
      <th>Brand</th>
      <th>Made In</th>
      <th>Price</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="product : ${listProducts}">
      <td th:text="${product.requestId}">Product ID</td>
      <td th:text="${product.name}">Name</td>
      <td th:text="${product.brand}">Brand</td>
      <td th:text="${product.madein}">Made in</td>
      <td th:text="${product.price}">Price</td>
    </tr>
    </tbody>
  </table>
</div>
</body>
</html>

如何每隔5秒拉取数据库表数据并刷新表数据?

tgabmvqs

tgabmvqs1#

虽然您仍然可以使用javascript setInterval函数调用API,如下所示:

setInterval(function() {
  $.ajax({
    url: 'http://yourserver.com/getproductlist',
    type: 'GET',
    success: function(data) {
      // your code to refresh the table here
    }
  });
}, 5000);

您的遗嘱:
1.服务器超载,想象一下数千人每5秒刷新一次。
1.显示旧数据的风险:数据将是5秒前的(示例产品可能脱销)。
一个更好的选择是使用真实的解决方案,使用WebSocket和消息传递,使用类似RabbitMQ的东西:
RabbitMQ会在数据库中的数据更改时向客户端发送更新(触发器可能会有帮助)。这样,客户端只在有新数据时才接收更新,而不是不断轮询服务器以获取更新。如果您在Azure中托管解决方案,则可以使用Azure存储队列或服务总线,在AWS中则可以使用SQS。类似的问题如下:Real time updates from database using JSF/Java EE

olhwl3o2

olhwl3o23#

你没有解释,你的要求到底是什么。数据真的每5秒改变一次吗?还是你不想错过一次更新?
要刷新您的网页,请使用此head标签:

<head>
  <title>Product Manager</title>
  <meta charset="utf-8"/>
  <meta http-equiv="refresh" content="5">
</head>

但是如果数据只是不时地变化,我会使用推送(而不是拉取)。
例如,对于HTML5服务器发送事件:https://www.w3schools.com/html/html5_serversentevents.asp
您可以使用spring Boot scheduler每5秒查询一次db表,也可以在数据发生变化时在服务器端使用消息传递(我更喜欢这样,这样可以减少CPU负载和带宽,并且更可持续)。

332nm8kg

332nm8kg4#

创建一个while循环,休眠5秒,然后从数据库中获取数据并更新DOM。

whhtz7ly

whhtz7ly5#

我认为,如果没有不同的体系结构,你所尝试做的是不可能的,因为你在这里有一个服务器端呈现的页面,它不使用websocket或类似的东西。
在“现代世界”中,您将有一个WebSocket客户端连接到您的后端,当您的数据库表发生更改时,它会真实的得到通知。(无论您是通过被动的方式知道数据更改,还是通过在后端使用“原始轮询到您的数据库表”,然后将更改推送到Websocket)
但如果你想保持现在的状态我看只有两个选择:
1.尝试一些 AJAX ,定期更新这个DOM元素
1.通过再次执行Rest API调用,每隔X秒用JavaScript刷新页面,这将重新加载数据

相关问题