idea多线程debug

问题描述

项目中需要多处用到数据库操作,为了减少耗时使用了新的线程去调用数据库的接口,但是使用intellij idea调试时发现数据一直没有插入到数据库,test下debug模式执行不成功。检查了代码,确定代码没问题。断点到插入数据库的命令上,按alt+F8执行Evaluate,报如下错误:

这里写图片描述

堆栈信息如下:(*—-公司信息,隐藏一下哈)

    org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Data source is closed
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:619)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:870)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:894)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:287)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:292)
    at com.***.framework.dal.client.support.executor.MappedSqlExecutor.execute4PrimaryKey(MappedSqlExecutor.java:609)
    at com.***.framework.dal.client.support.executor.MappedSqlExecutor.execute(MappedSqlExecutor.java:575)
    at com.***.framework.dal.client.support.executor.MappedSqlExecutor.execute(MappedSqlExecutor.java:563)
    at com.***.framework.dal.client.support.DefaultDalClient.execute(DefaultDalClient.java:271)
    at com.***.DAO.insertOrderLogs(OrderLogsDAO.java:36)
    at com.***.Thread.run(OrderLogsThread.java:81)
    at java.lang.Thread.run(Thread.java:748)

解决思路

  • 分析报错

    首先分析一下报错信息,报错信息很明显,数据库连接有问题。但是项目已经上线很久,比较成熟。JDBC配置不可能有问题。分析可能是代码编写有误。

  • 检查代码

    检查了代码发现没有问题,然后把已上线的数据库操作放过来执行,一样无法执行。同事说可能需要加上事务,虽然我觉得不太相关,还是测试了一下,依然不行。

  • 去掉多线程测试

    直接在主线程下执行数据库操作,发现可以正常操作数据库-。-
    开始怀疑新线程没有获取JDBC连接参数,但是断点断到数据库命令下,发现datasource有值,JDBC的配置都正确。一脸懵逼。。。

  • intellij idea配置

    上网查了一下,Idea会在我们调试一个线程时,屏蔽另一个线程的断点。也就是说debug模式下可能只有一个主线程在跑。这肯定没法接受。。。又折腾一会,发现idea提供了多线程调试的功能,在断点处右键:
    这里写图片描述
    它提供了两种挂起的模式,默认的是All,只需要选中Thread,它就会一直等待到你处理它。断点的位置一定要正确,run方法或者run以后调用的方法里,否则的话,程序跑完了,debug模式里也只有一个主线程在跑

  • 解决方法

    在Thread(t).start()下加上断点,右键选择Thread。断点断到之后,按F8单步执行一下,后面就可以正常调试了。

这里写图片描述

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/songfeihu0810232/article/details/79948142
个人分类: 编程工具
上一篇互联网电商技术---CDN
下一篇java参数传递
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭