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

Slick+H2数据库创建条目后立即查询不到记录问题排查

问题原因及解决办法

你遇到的这个问题,大概率是H2内存数据库的默认行为导致的——当最后一个数据库连接关闭时,H2会自动销毁整个内存数据库实例。结合Slick的连接池机制来看:

当你执行create操作完成后,Slick的连接池会把连接放回池并可能关闭它,此时H2会认为没有活跃连接,直接销毁了你的测试数据库。等到getById执行时,连接池会创建新的连接,这时候其实是一个全新的空数据库,自然查不到之前插入的BankProduct记录。你提到添加autoCommit无效,是因为这个问题根本不在事务提交上,而是数据库实例被销毁了。

解决办法

最直接有效的修复是修改你的H2 JDBC URL,添加DB_CLOSE_DELAY=-1参数,强制H2即使在所有连接关闭后也保留内存数据库实例:

val h2Url = randomDB + "MODE=MySql;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;INIT=runscript from 'src/test/resources/schema.sql'\\;runscript from 'src/test/resources/schemadata.sql'"

额外验证点

为了确保万无一失,你还可以检查以下几点:

  • 确认create方法正确使用了bankProductTableAutoInc返回自增ID,确保插入成功后拿到的是正确的记录ID
  • 确保getById方法的查询逻辑正确(比如是根据id字段精确匹配,而非其他字段)
  • 可以显式将create和getById包裹在同一个事务中执行,进一步保证数据一致性:
    val response = db.run(
      (for {
        id <- create(BankProduct("car loan", 1))
        product <- getById(id)
      } yield product).transactionally
    )
    

内容的提问来源于stack exchange,提问作者tharindu_DG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:54