mybatis批量更新(BATCH)报空指针异常(Error committing transaction. Cause:NullPointerException)

文章描述了在项目中整合Mybatis时遇到的批量插入空指针异常,经排查发现是由于未设置默认的SQL语句超时时间。通过分析代码和配置,作者解决了问题并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目整合了mybatis,做mybatis批量插入时报空指针异常,最后发现是没有设置超时时间,在此记录一下问题排查过程~

先附上解决代码(mybatis-config.xml):

<setting name="defaultStatementTimeout"  value="20"/>

当调用提交commit()时出现空指针异常时,没有找到具体报错的类,只能根据堆栈信息一层层往下找

查询资料发现当使用commit时,会调用DefaultSqlSession.commit()​​​​​​​

可以发现DefaultSqlSession.commit()中有个抛错

throw ExceptionFactory.wrapException("Error committing transaction.  Cause: " + var6, var6);

其中错误信息(Error committing transaction. Cause)与我们遇到的抛错信息一致,在抛错行打断点,执行操作发现确实是这里抛出的错,那么大致判断就是DefaultSqlSession.commit()出现空指针异常;

继续往下找到BaseExecutor.commit();因为我们使用的是ExecutorType.BATCH,对应的执行器的类是BatchExecutor,所以找到BatchExecutor.doFlushStatements()

但是继续打断点,发现这个方法中的第一行和最后一行都执行了,而整个代码中第一层的try有finally,但是没有catch,大致判断出就是第一个try出现问题,然后被丢弃了,所以没有影响这个方法中后续代码执行;

在try中每隔几行打个断点,缩小寻找问题的范围

最终定位到this.applyTransactionTimeout(stmt);出现问题;

进入方法,发现确实是这里出问题

StatementUtil.applyTransactionTimeout(statement, statement.getQueryTimeout(), this.transaction.getTimeout())

挨个排查参数,定位到空指针异常

statement.getQueryTimeout()

去网上查阅资料发现getQueryTimeout一般指超时时间,所以尝试在mybatis-config.xml中添加代码

最后程序正常执行啦!

### 回答1: 这是MyBatis持久化异常,错误信息是“打开会话时出错,原因是Java.lang.NullPointerException,导致是Java.lang.NullPointerException”。可能是因为在打开会话时出现了空指针异常。 ### 回答2: org.apache.ibatis.exceptions.PersistenceException是MyBatis框架抛出的一个异常,通常是由于MyBatis在处理数据库操作时遇到了错误或异常。基本上,这个异常都是由底层数据库抛出的,例如MySQL或Oracle等。当MyBatis执行SQL语句时,如果发生了任何错误,就会抛出这个异常MyBatis是一款优秀的Java持久化框架,为开发人员提供了一种轻松访问数据库的方法。它采用XML文件或注解的方式,将Java对象映射到数据库中的关系型数据。如果MyBatis无法处理数据库操作,就会抛出org.apache.ibatis.exceptions.PersistenceException异常。在处理这个异常时,需要定位问题的根源,并分析错误类型和错误信息。通常,可以从错误堆栈信息中获取有关异常的详细信息。 在处理这个异常时,需要注意一些常见的错误类型,例如,SQL语法错误、连接数据库失败、调用不存在的方法或查询返回的结果集为空等。这些问题都可能导致org.apache.ibatis.exceptions.PersistenceException异常的抛出。要解决这些问题,需要仔细检查代码和配置文件,并进行逐步调试和测试。 总之,org.apache.ibatis.exceptions.PersistenceException是MyBatis中的一个重要异常,表示MyBatis无法处理数据库操作,通常由底层数据库抛出。在处理这个异常时,需要仔细分析问题的根源,并进行逐步调试和测试,以找到解决方案。 ### 回答3: org.apache.ibatis.exceptions.PersistenceException是一个MyBatis框架中的异常MyBatis是一款开源的Java持久层框架,用于将SQL语句和Java对象之间的映射。而org.apache.ibatis.exceptions.PersistenceException是MyBatis中的一个错误类型,它表示在进行持久化操作的过程中出现了异常。 在MyBatis的持久化操作中,通常会使用Mapper接口来定义SQL语句与Java方法的映射,以及执行具体的数据库操作。当一个Mapper方法执行出现错误时,MyBatis会自动抛出org.apache.ibatis.exceptions.PersistenceException异常。 org.apache.ibatis.exceptions.PersistenceException是一个父异常,它有多个子异常。常见的子异常包括: 1. org.apache.ibatis.exceptions.TooManyResultsException:当查询操作返回多个结果时,MyBatis会抛出此异常。 2. org.apache.ibatis.exceptions.NullPointerException:当参数为空时,MyBatis会抛出此异常。 3. org.apache.ibatis.exceptions.DataIntegrityViolationException:当尝试插入、更新或删除数据时违反了数据完整性约束条件时,MyBatis会抛出此异常。 4. org.apache.ibatis.exceptions.TypeMismatchException:当参数类型与Mapper方法定义的类型不匹配时,MyBatis会抛出此异常。 5. org.apache.ibatis.exceptions.PersistenceException:其他未被上述子异常所覆盖的异常。 总之,org.apache.ibatis.exceptions.PersistenceException是一个MyBatis中的基础异常,它代表着持久化操作中出现了一些未知的异常。在进行MyBatis开发时,应该根据具体情况对异常进行详细的处理,以保证系统的稳定性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值