代码之家  ›  专栏  ›  技术社区  ›  Manish

hSQL执行INSERT时出错:[SQLITE_BUSY]数据库文件已锁定

  •  0
  • Manish  · 技术社区  · 4 年前

    我在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的多个连接怎么可能存在。有人能告诉我上面的代码有什么问题吗。

    谢谢

    0 回复  |  直到 4 年前
    推荐文章