MyBatis执行Insert无异常但数据库未更新(已调用commit())
问题场景
首次使用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

