都好AllGood 2022-03-06 14:21
浏览 42
已结题

关于使用ExecutorService连接数据库失败也不报错的请教

问题遇到的现象和发生背景

想使用异步线程去调用数据库(mybatis连接)并更改数据

问题相关代码,请勿粘贴截图
private static SqlSession sqlSession;
private static InputStream in;

private static ThreadLocal<DateFormat> dateThreadLocal = new ThreadLocal<DateFormat>() {
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    }
};

static {
    try {
        in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
        sqlSession = sessionFactory.openSession();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Test
public void testUpdate(){

    ExecutorService executorService = Executors.newCachedThreadPool();
    executorService.execute(() -> {
        try {
            System.out.println("进入了缓存线程池中!~");
            Date date = dateThreadLocal.get().parse("2022-3-5 23:56:27");
            Emp emp = new Emp();
            emp.setName("王老七");
            emp.setUpdate_time(date);
            int row = sqlSession.update("EmpMapper.update", emp);
            sqlSession.commit();
            System.out.println("更新成功! 影响行数: " + row);
            sqlSession.close();
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
运行结果及报错内容
   控制台只打印了System.out.println("进入了缓存线程池中!~");并没有报错信息,断点跟到System.out.println("进入了缓存线程池中!~");再下一步就直接结束运行了

    根据log查看到:

java.util.concurrent.TimeoutException
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204)
at com.intellij.debugger.impl.attach.JavaAttachDebuggerProvider.getProcessAttachInfo(JavaAttachDebuggerProvider.java:213)
at com.intellij.debugger.impl.attach.JavaAttachDebuggerProvider.getAttachInfo(JavaAttachDebuggerProvider.java:173)
at com.intellij.debugger.impl.attach.JavaAttachDebuggerProvider.getProcessAttachInfo(JavaAttachDebuggerProvider.java:227)
at com.intellij.debugger.impl.attach.JavaDebuggerAttachUtil.canAttach(JavaDebuggerAttachUtil.java:21)
at com.intellij.execution.impl.DefaultJavaProgramRunner$AttachDebuggerAction$1.lambda$startNotified$0(DefaultJavaProgramRunner.java:289)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:224)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)

我的解答思路和尝试过的方法

只要把上面的代码注掉 ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> { });
直接运行就可以执行成功

我想要达到的结果
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 3月14日
    • 创建了问题 3月6日