Kotlin应用基于Flyway+MyBatis+HikariCP组合的调试场景数据库连接泄漏问题排查求助
Kotlin应用基于Flyway+MyBatis+HikariCP组合的调试场景数据库连接泄漏问题排查求助
各位大佬好,我现在在开发一个纯Kotlin应用,遇到了数据库连接泄漏的问题,想请大家帮忙分析下根因到底出在哪。
先说说我的技术栈:
- MyBatis 版本:3.5.16
- Flyway 版本:10.19.0
- HikariCP 版本:6.0.0
开发工具用的是IntelliJ IDEA,这个点可能很关键——我发现开发过程中经常会出现“连接数过多”的错误,怀疑是调试时频繁终止进程导致的,这种异常终止可能会阻止连接被优雅关闭。
不过我手动复现多次(反复启动、终止进程)后,用show processlist;查数据库进程列表,结果是空的,没看到明显的连接泄漏情况,所以暂时没找到明确的根因。
下面是我在应用启动时初始化数据库相关组件的代码:
class DB(props: AppProperties) { private val hikariSource: HikariDataSource private var batisSessionFactory: SqlSessionFactory // Constructor init { // HikariCP hikariSource = HikariDataSource() hikariSource.jdbcUrl = props.databaseUrl hikariSource.username = props.databaseUser hikariSource.password = props.databasePass hikariSource.maximumPoolSize = 5 hikariSource.isAutoCommit = true // Flyway val config = Flyway .configure() .dataSource(hikariSource) .baselineOnMigrate(true) val flyway = Flyway(config) flyway.migrate() // MyBatis batisSessionFactory = createSqlSessionFactory(hikariSource).apply { configuration.addMapper(UserDao::class.java) } } fun <T> withUserDao(autoCommit: Boolean = true, block: UserDao.() -> T) : T { return batisSessionFactory.openSession(autoCommit).use { val userDao = it.getMapper(UserDao::class.java) block(userDao) } } private fun createSqlSessionFactory(dataSource: DataSource): SqlSessionFactory { val configuration = Configuration() // Pass your custom DataSource to the environment val environment = org.apache.ibatis.mapping.Environment( props.environment, org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory(), dataSource ) configuration.environment = environment return SqlSessionFactoryBuilder().build(configuration) } }
补充说明一下withUserDao函数,这个函数的作用和Java的try-with-resources类似:
- 打开MyBatis会话(相当于自动管理资源)
- 在会话范围内获取UserDao的Mapper实例,传递给外部lambda执行业务逻辑
- 不管逻辑执行成功还是失败,都会自动关闭MyBatis会话
现在我纠结的点是:到底是HikariCP、Flyway还是MyBatis哪一个组件可能导致连接泄漏?或者有没有我代码里没注意到的细节问题?
备注:内容来源于stack exchange,提问作者Vetalll
相关产品推荐
相关产品推荐

