spring hibernate异步任务问题找不到当前线程

时间:2016-12-23 07:34:44

标签: java spring multithreading hibernate completable-future

这是我保存数据的方法。它工作正常

    public Future<SocialLogin> loginUserSocial(Social model) {
        Session session = this.sessionFactory.getCurrentSession();
        session.save(model);
        SocialLogin dto = new SocialLogin();
        dto.setUser_id(model.getUser_id());
        return new AsyncResult<SocialLogin>(dto);
    }

但是如果我在方法上添加@Async注释 我有以下例外。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.util.concurrent.ExecutionException: org.hibernate.HibernateException: No Session found for current thread
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

如果有人知道这个例外,我很感激。 感谢

1 个答案:

答案 0 :(得分:3)

来自here

  

实现者不应该是线程安全的。相反,每个线程/事务应该从SessionFactory获取自己的实例。

根据文档线程应该有自己的会话。如果你通过sessionFactory.getCurrentSession();获得会话,那么你将获得null,因为它的访问受ThreadLocals的保护。

您可以通过此代码为每个线程创建新会话。

@Async
public Future<SocialLogin> loginUserSocial(Social model) {
        Session session = this.sessionFactory.openSession();
        session.save(model);
        SocialLogin dto = new SocialLogin();
        dto.setUser_id(model.getUser_id());
        return new AsyncResult<SocialLogin>(dto);
    }