Файл блокировки xd.lck не удаляется после закрытия магазина - PullRequest
0 голосов
/ 25 апреля 2020

Мое предположение о блокировке базы данных xodus заключалось в том, что закрытие хранилища сущностей закроет базу данных.

Я реализовал это на простом примере, используя шаблон use, который вызывает close:

package whatever

import jetbrains.exodus.entitystore.Entity
import kotlinx.dnq.XdEntity
import kotlinx.dnq.XdModel
import kotlinx.dnq.XdNaturalEntityType
import kotlinx.dnq.store.container.StaticStoreContainer
import kotlinx.dnq.util.initMetaData
import kotlinx.dnq.xdRequiredStringProp
import org.junit.Test
import java.nio.file.Files

class UnclosedTest {
    private val dbFolder = Files.createTempDirectory(null).toFile()

    private val store = StaticStoreContainer.init(
            dbFolder = dbFolder,
            environmentName = "store"
    ).also {
        XdModel.registerNodes(
                Bogus
        )

        initMetaData(XdModel.hierarchy, it)
    }

    @Test
    fun `lock file is removed when store is closed`() {
        store.use { store ->
            store.transactional {
                Bogus.new {
                    text = "gnarf"
                }
            }
        }

        assert(dbFolder.exists())
        assert(dbFolder.isDirectory)
        assert(!dbFolder.resolve("xd.lck").exists())
    }

    class Bogus(entity: Entity) : XdEntity(entity) {
        companion object : XdNaturalEntityType<Bogus>()

        var text by xdRequiredStringProp()
    }
}

Удивительно, но этот тест завершается неудачно с сохранением файла xd.lck.

Как закрыть все ресурсы, убедившись, что файл блокировки удален?

1 Ответ

1 голос
/ 25 апреля 2020

Файл xd.lck выпускается при закрытии базы данных, не удаляется, независимо от того, какой API вы используете: Environments, EntityStores или Xodus-DNQ DSL. Смотрите как это реализовано .

...