SpringBoot Sqlite数据库文件锁定错误,无多线程

ewm0tg9j  于 2022-11-14  发布在  SQLite
关注(0)|答案(2)|浏览(404)

我在SQLite数据库文件锁定问题上遇到的所有答案都涉及到同时读取和写入。但是,即使在单线程模式下运行,在我运行的集成测试中也会面临这个问题

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest

更新:在甚至不知道为什么它应该有帮助的情况下,我在读写数据库的代码中添加了同步语句,之后错误就没有发生。
由于SpringBoot本身并不支持SQLite,所以我在

spring.jpa.database-platform=com.springboot.sqlite.SQLDialect

顺便说一句,我还有

spring.datasource.maxActive = 1

此外,我还设置了预写日志:

jdbcTemplate.execute("pragma journal_mode=WAL");

我的测试只按顺序运行几个读写操作,但它失败了

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

at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1542)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:393)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:558)

任何帮助都是非常感激的。

rpppsulh

rpppsulh1#

尝试将以下配置添加到Applation.Properties

spring.datasource.hikari.maximum-pool-size=1
ojsjcaue

ojsjcaue2#

我在这里遇到了完全相同的问题,每次尝试从多个线程进行多个读/写操作时,SQLite DB都会锁定。
我所做的是将读/写存储库(SQLite DB)的命令放在@Service类中。然后用@async标志注解相应的函数,这样它就不会锁定主线程,并将对存储库的访问放在“同步(存储库)...”中。
示例:

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    @Async
    public void accessDb() {

        synchronized (myRepository) {

                MyEntity myEntity = myRepository.findById(1);
                myEntity.setModifiedAt(new Date());
                myRepository.save(myEntity);

        }

    }

}

相关问题