You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:10:30