java - spring hibernate 异步任务问题 No Session found for current thread

标签 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)

如果有人知道此异常,我将不胜感激。 谢谢

最佳答案

来自 here

It is not intended that implementors be threadsafe. Instead each thread/transaction should obtain its own instance from a SessionFactory.

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

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

@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);
    }

关于java - spring hibernate 异步任务问题 No Session found for current thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41297127/

相关文章:

java - 使用 Java 8 Optional 实现安全的 Map 遍历

java - 如何在 epub 页面中创建分页?安卓

java - 如何在 Spring Security 中使用自定义角色/权限?

JAVA SPRING MVC 在页面上显示之前修改输出流

c - 对 pthread_create 和 pthread_join 的 undefined reference

.net - 异步方法模式与如何在没有它的情况下重用线程

c++ - std::atomic<int> 递减和比较

java - 返回在 runSync 方法中创建的对象的值

java - Android - 隐藏文本 --> 显示文本 2 秒 --> 再次隐藏文本

java - 如何为不同的 URL 堆叠 CORS 过滤器?