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

MyBatis执行Insert无异常但数据库未更新(已调用commit())

MyBatis插入SQLite数据库返回受影响行数但数据库无更新的排查方案

问题场景

首次使用MyBatis向SQLite执行插入操作,XML映射语句如下:

<insert id="insertClub" parameterType="uk.co.redfruit.gdx.velvetbelly.core.data.Club" flushCache="true">
    insert into clubs (id, name, squad_size) values (null, #{name}, #{squadSize});
</insert>

调用代码:

int result = session.insert("insertClub", club);
session.commit(true);
session.close();

代码无报错,返回受影响行数1,但实际数据库文件未更新,确认查看的是正确文件,查询不到插入数据;手动执行日志输出的SQL语句可正常生效,已尝试调用commit()、close()及设置自动提交,均无效果且无异常抛出。

排查与解决要点

  • 确认SQLite数据库文件路径一致性
    SQLite是文件型数据库,若连接配置使用相对路径,可能存在代码运行工作目录与你查看的文件目录不一致的情况,导致实际写入了另一个位置的SQLite文件。可在代码中打印连接URL对应的绝对路径,验证是否指向目标文件。

  • 验证事务刷写逻辑
    虽然调用了session.commit(true),但SQLite默认开启WAL(Write-Ahead Logging)模式,数据可能先写入WAL文件而非直接合并到主数据库文件,需等待WAL合并或手动触发。可修改连接URL关闭WAL模式测试:jdbc:sqlite:/path/to/your/db?journal_mode=DELETE。另外,可在提交后立即在同一会话内执行查询,若会话内能查到数据但文件中没有,说明事务未完成磁盘刷写。

  • 检查SqlSession实例有效性
    确保SqlSession是从SqlSessionFactory正确获取的单一实例,避免重复创建或使用错误会话。若在Spring环境中,需确认是否存在事务管理注解与手动提交的冲突;原生MyBatis环境下,要保证插入、提交、关闭操作使用的是同一个会话对象。

  • 更新SQLite JDBC驱动版本
    部分旧版本SQLite JDBC驱动与MyBatis存在兼容性问题,导致事务提交后未正确同步数据到磁盘。尝试更新至最新稳定版驱动后重新测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:54:58