kotlin - Micronaut:初始化 jdbc 连接时 MicronautTest 中的竞争条件
问题描述
由于从 Micronaut 1.3.2 升级到 1.3.4,我们涉及 jdbc 层的单元测试随机失败并出现错误:
io.micronaut.transaction.exceptions.NoTransactionException:不存在当前事务。考虑在周围的方法上声明@Transactional
它大约有 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% 工作了
推荐阅读
- php - 无效的捆绑包模板覆盖
- java - 用单个类构建“父/子”系统
- jquery - 通过按下回车键而不触发 commandButton 提交事件来编辑 treeTable primefaces 上的行
- python - 拦截(使用 Python)从另一个进程写入文件的数据
- git - 在 GitHub 中,更新一个分支以匹配另一个分支
- c# - 为什么我在实例化抽象类时会出错?
- javascript - 如何使“显示更多”和“显示更少”按钮仅适用于它们自己的 div 中的文本,而不适用于使用 Vue.js 的所有文本
- html - 如何在 SAS 中处理 href 中的撇号
- ios - 如何判断何时可以重新加载表视图,以便它显示我已下载和解析的 JSON 数据?
- java - BufferedReader readLine 返回 null