我在Micronaut应用程序中使用sqlite作为db,在下面的代码中出现sqlite busy错误:
@SneakyThrows
@TransactionalAdvice(value = EmpDao.DATASOURCE, propagation = TransactionDefinition.Propagation.REQUIRES_NEW)
public void storeEmp(EmpDto empDto) {
String id = empDto.getId();
try {
if (empDao.existsById(id)) {
log.debug("updating emp for id {}", empDto.getId());
empDao.update(EmpEntity.builder()
.id(id)
.data(getJson(empDto))
.entryCreatedAt(timeService.nowDateTime().toEpochSecond(ZoneOffset.UTC))
.build());
} else {
empDao.save(
EmpEntity.builder()
.id(id)
.data(getJson(empDto))
.entryCreatedAt(timeService.nowDateTime().toEpochSecond(ZoneOffset.UTC))
.build());
}
}catch(Exception e){
log.error("emp db save/update failed for id {} ",id, e);
}
}
@SneakyThrows
@TransactionalAdvice(value = EmpDao.DATASOURCE, propagation = TransactionDefinition.Propagation.REQUIRES_NEW)
public void storeEmployees(List<Emp> empDtos) {
try {
empDao.saveAll(empDto);
} catch (Exception ex) {
log.warn("saveAll failed", ex);
empDtos.forEach(this::storeEmp);
}
}
在stacktrace中我可以先看到
saveAll
由于主键约束问题,获取失败,这可能是因为列表中存在重复的emp ID
SQL error executing INSERT: [SQLITE_CONSTRAINT_PRIMARYKEY] A PRIMARY KEY constraint failed
之后,当它试图通过forEach中的storeEmp方法独立地保存/更新每个emp对象时,由于sqlite busy异常而失败。
我不确定的是,如果saveAll已经失败,那么到sqlite的多个连接怎么可能存在。有人能告诉我上面的代码有什么问题吗。
谢谢