开发者社区 问答 正文

插入数据之后,然后在同一个方法中更新这条数据,如果中间时间太长,会报错

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

Error updating database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: interrupt Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: interrupt 试过很多次了,去掉druid就不会报错,加了druid就报错,插入和更新用的是同一个连接导致的?该如何解决这个问题啊??下面是我的配置

T43.png

T44.png

更新成了这个配置,也会报错,注释掉所有druid的配置包括依赖,就没有问题!

原提问者GitHub用户patience00

展开
收起
山海行 2023-07-05 19:47:15 101 分享 版权
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    种情况可能会报空指针异常,原因是:

    在同一个事务中,先插入数据,然后等待一段时间再更新该数据。

    由于等待的时间比较长,数据库回收了该行记录,导致找不到要更新的数据行。

    具体可能如下:

    java
    Copy
    public void method(){
    // 插入数据
    insertData();

    // 等待一分钟
    Thread.sleep(60000);

    // 尝试更新这条数据,但数据库回收了这条记录,导致找不到要更新的记录,报空指针
    updateData();
    }
    为了避免这种情况,有几种处理方式:

    减少等待时间,让更新操作尽快执行。

    在更新前,重新获取这条记录,确保还存在。

    java
    Copy
    public void method(){
    insertData();

    Thread.sleep(60000);

    // 在更新前,重新根据ID查询出这条数据
    Data data = findDataById();
    if(data != null){
    updateData(data);
    }
    }
    在插入时,将数据ID返回,用于之后直接更新。

    将两步操作放在同一个事务中执行,确保数据不丢失。

    2023-07-30 15:42:51
    赞同 展开评论
  • maxActive配大试试看

    原回答者GitHub用户wenshao

    2023-07-06 11:06:08
    赞同 展开评论
问答分类:
问答地址: