2016-12-23 9 views
3

これはデータを保存する私の方法です。それはspring hibernate非同期タスクの問題現在のスレッドでセッションが見つかりません

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

将来を含むBeanを投稿してください。<..> –

答えて

3

here

から 感謝。代わりに、各スレッド/トランザクションはSessionFactoryから独自のインスタンスを取得する必要があります。

ドキュメントスレッドには、独自のセッションが必要です。 sessionFactory.getCurrentSession();でセッションを取得すると、そのアクセスがThreadLocalsによって保護されているため、nullが返されます。

このコードでスレッドごとに新しいセッションを作成できます。

@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

正常に動作します。詳細については、 をお読みください。 –

関連する問題