我正在使用 Spring Boot 开发后端应用程序,我的应用程序使用 PostgreSQL 作为数据库。传感器数据每秒都会被插入到数据库中。
我想监控数据,如果相同的值连续1小时插入数据库,则发送电子邮件通知。例如:
如果 1 小时内每秒将值 42 插入表中,我想检测到这一点并发送电子邮件。 这是我的主要问题:
我是否应该在 Spring Boot 应用程序中实现此逻辑(例如,使用计划作业来查询和监控数据)? 完全在 PostgreSQL 中处理这个问题是否更好(例如,使用触发器或其他数据库机制)? 每种方法的优缺点是什么,您会推荐哪种方法用于此用例?如果可能的话,我希望获得代码示例或有关如何实现它的指导。
我可能会做类似的事情:
@Service
public class SensorMonitor {
@Autowired
private SensorDataRepository sensorDataRepository;
private Map<String, SensorDataRecord> sensorDataMap;
@PostConstruct
public void init() {
sensorDataMap = new HashMap<>();
//todo fill map from db from last hour per sensor when service is restarted
}
public void insertSensorData(String sensorName, int currentValue) {
String sensorName = data.getSensorName();
int currentValue = data.getValue();
LocalDateTime currentTime = LocalDateTime.now();
sensorDataRepository.save(...);
SensorData record = sensorDataMap.get(sensorName);
if (record == null) {
record = new SensorData(currentValue, currentTime);
sensorDataMap.put(sensorName, record);
} else {
if (record.getValue() == currentValue) {
if (record.getTimestamp().plusHours(1).isBefore(currentTime)) {
sendNotification(sensorName, currentValue);
sensorDataMap.remove(sensorName);
}
} else {
record.setValue(currentValue);
record.setTimestamp(currentTime);
}
}
}
private void sendNotification(String sensorName, int value) {
//send notification
}
private static class SensorData {
private int value;
private LocalDateTime timestamp;
....
}
}
为了防止太多的数据库请求,我会将这些值保留在内存中。