服务从构造函数中的DB获取数据并将其存储在HashMap
中,然后从HashMap
返回数据。请看一下:
@RestController
@RequestMapping("/scheduler/api")
@Transactional(readOnly = true, transactionManager = "cnmdbTm")
public class RestApiController {
private final Set<String> cache;
@Autowired
public RestApiController(CNMDBFqdnRepository cnmdbRepository, CNMTSFqdnRepository cnmtsRepository) {
cache = new HashSet<>();
cache.addAll(getAllFqdn(cnmdbRepository.findAllFqdn()));
cache.addAll(getAllFqdn(cnmtsRepository.findAllFqdn()));
}
@RequestMapping(value = "/fqdn", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public List<SchedulerRestDto> checkFqdn(@RequestBody List<SchedulerRestDto> queryList) throws ExecutionException {
for (SchedulerRestDto item : queryList) {
item.setFound(1);
if (!cache.contains(item.getFqdn())) {
item.setFound(0);
}
}
return queryList;
}
private Set<String> getAllFqdn(List<String> fqdnList) {
Set<String> result = new HashSet<>();
for (String fqdn : fqdnList) {
result.add(fqdn);
}
return result;
}
}
但我总是在大约2秒内得到一个结果。我认为从DB获得的35K字符串有点慢。
我试图找出问题所在。我将序列化的HashMap
存储到文件和修改的构造函数:
@Autowired
public RestApiController(CNMDBFqdnRepository cnmdbRepository, CNMTSFqdnRepository cnmtsRepository) {
try (final InputStream fis = getResourceAsStream("cache-hashset.ser");
final ObjectInputStream ois = new ObjectInputStream(fis)) {
cache = (Set<String>) ois.readObject();
}
}
该服务返回结果后不到100毫秒。
我认为它与数据库有关,但我并不确切知道如何解决它。
有什么想法吗?
答案 0 :(得分:1)
经过几个小时的实验,我意识到主要原因是在课堂上注释@Transactional。
当我在方法上移动此注释时,服务更快地返回响应。在我最后的决定中,我将这个注释移到了另一个类。
是新的构造函数@Autowired
public RestApiController(FqdnService fqdnService, SqsService sqsService) {
Objects.requireNonNull(fqdnService);
cache = fqdnService.getCache();
}
代码更清晰,没有任何性能问题。