Открытое соединение SQLite не работает с SQLITE_BUSY

Я пытаюсь создать приложение с использованием Ktor и Exposed с SQLite. К сожалению, мое приложение продолжает давать сбой.

Это мое подключение к базе данных:

class DatabaseFactory(connection: DatabaseConnection) {
    init {
        connect()
        createSchema()
    }

    private fun connect() {
        Database.connect("jdbc:sqlite:/path/to/file", "org.sqlite.JDBC")
        TransactionManager.manager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE
    }

    private fun createSchema() {
        transaction {
            SchemaUtils.create(Images)
            SchemaUtils.create(KeyValues)

            Images.deleteAll()
        }
    }

    suspend fun <T> dbQuery(block: () -> T): T =
        withContext(Dispatchers.IO) {
            transaction { block() }
        }
}

// access db with
DatabaseFactory.dbQuery {
    // do stuff
}

При запуске моего приложения я получаю следующую ошибку:

org.jetbrains.exposed.exceptions.ExposedSQLException: org.sqlite.SQLiteException: [SQLITE_BUSY]  The database file is locked (database is locked)

person multiholle    schedule 26.02.2020    source источник


Ответы (1)


Когда вы используете сопрограммы и запускаете свой код в Dispatchers.IO, ваши запросы могут выполняться в отдельных потоках, которые рассматриваются как multiple processes, которые могут читать только из экземпляра SQLite.

Подробнее о документации SQLite

person Tapac    schedule 26.02.2020
comment
Как мне убедиться, что есть только одно соединение? - person multiholle; 26.02.2020