Kotlin Micronaut:初始化jdbc连接时MicronautTest中的竞争条件

Kotlin Micronaut:初始化jdbc连接时MicronautTest中的竞争条件,kotlin,micronaut,Kotlin,Micronaut,由于从Micronaut 1.3.2升级到1.3.4,我们涉及jdbc层的单元测试随机失败,错误如下: io.micronaut.transaction.exceptions.NotTransactionException:当前不存在任何事务。考虑在周围方法< /P>声明“事务性” 它大约有50%的时间失败 此代码块中发生异常 @PostConstruct @Transactional private fun init() { liquibase = Liquibase(

由于从Micronaut 1.3.2升级到1.3.4,我们涉及jdbc层的单元测试随机失败,错误如下:

io.micronaut.transaction.exceptions.NotTransactionException:当前不存在任何事务。考虑在周围方法< /P>声明“事务性” 它大约有50%的时间失败

此代码块中发生异常

@PostConstruct
@Transactional
private fun init() {
    liquibase = Liquibase(
        "db/liquibase-changelog.xml",
        ClassLoaderResourceAccessor(),
        JdbcConnection(dataSource.getConnection())
    )
}
在这个班

@Singleton
open class TestUtils {
    @Inject
    @field:Client("/")
    lateinit var client: HttpClient
    @Inject
    lateinit var objectMapper: ObjectMapper
    @field:Property(name = "micronaut.application.name")
    lateinit var applicationName: String
    @field:Property(name = "micronaut.application.version")
    lateinit var applicationVersion: String
    @field:Property(name = "testing.security.access-token")
    lateinit var accessToken: String

    @Inject
    lateinit var dataSource: DataSource

    private var liquibase: Liquibase? = null

    @PostConstruct
    @Transactional
    private fun init() {
        liquibase = Liquibase(
            "db/liquibase-changelog.xml",
            ClassLoaderResourceAccessor(),
            JdbcConnection(dataSource.getConnection())
        )
    }

    fun tearDownDatabase(){
        liquibase?.dropAll()
    }

    fun setUpDatabase(){
        liquibase?.update("")
    }
}

最终找到了解决方案,必须将liquibase的初始化移到它自己的方法:

    @PostConstruct
    private fun init() {
        initLiquibase()
    }

    @Transactional
    private fun initLiquibase() {
        liquibase = Liquibase(
            "db/liquibase-changelog.xml",
            ClassLoaderResourceAccessor(),
            JdbcConnection(dataSource.getConnection())
        )
    }

现在它似乎又100%地工作了

为什么你希望
@PostConstruct
方法是事务性的?@JeffScottBrown我认为它必须存在,因为Liquibase执行一些插入,但无论如何这不是问题,行为保持不变,不管有没有它,你操作数据库的调用都需要一个事务,不是init方法。