2016-12-23 2 views
3

Это мой метод сохранения данных. Он работает отличноspring hibernate Задача задачи Async Нет сеанса для текущей темы

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 annotion по методу я получил следующее исключение.

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

Пожалуйста, разместите свой бит, содержащий будущее <..>. –

ответ

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); 
    } 
+0

он отлично работает. спасибо, для подробного объяснения. –

Смежные вопросы