执行孤立的工作的错误试图保存Iterable

时间:2017-04-04 19:41:09

标签: java hibernate sqlite spring-data-jpa

我有以下方法:

List<BinValue> binValues = Arrays
         .stream(data)
...
         .collect(Collectors.toList());

      binValueRepo.deleteByStatId(databaseGlobals.getMarriedStat().getId());
//      for(BinValue binValue : binValues) {
//         binValueRepo.save(binValue);
//      }
      binValueRepo.save(binValues);

首先,它准备一个BinValue实体列表,然后尝试将其保存到存储库。

问题是:如果我尝试保存整个列表,则会出现以下错误:

org.springframework.dao.CannotAcquireLockException: error performing isolated work; SQL [n/a];...

LockAcquisitionException: error performing isolated work

org.sqlite.SQLiteException: [SQLITE_BUSY]  The database file is locked (database is locked)

如果我一个人这样做,那么一切都有效(但很慢)。

要填充BinValue,我使用以下代码:

        BinValue ans = new BinValue();
        ans.setBin(bin);
        ans.setRegion(region);
        ...

即。我没有填写主要关键字段。

通过以下方式定义:

@Entity
@Table(name = "bin_values")
@NoArgsConstructor
@AllArgsConstructor
public class BinValue {

   @Id
   @Column(name="id")
   @GeneratedValue(generator="sqlite")
   @TableGenerator(name="sqlite", table="sqlite_sequence",
      pkColumnName="name", valueColumnName="seq",
      pkColumnValue="bin_values")
   @Getter
   @Setter
   private long id;

1 个答案:

答案 0 :(得分:0)

显然,将最大连接数设置为1以解决此问题

 @Bean
   public DataSource dataSource() {
      BasicDataSource ans = new BasicDataSource();
      ans.setDriverClassName("org.sqlite.JDBC");
      ans.setUrl("jdbc:sqlite:" + sqliteDatabaseFile().getAbsolutePath());
      ans.setMaxTotal(1);


      return ans;
   }