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
相关产品推荐
相关产品推荐

