springmvc 异步线程绑定session

场景:
  对spring mvc的controller进行拦截,且在s(springmvc)s(spring)h(hibernate)环境中异步处理数据。
问题:
1 spring aop配置:
   若是是对service/dao进行拦截处理,在applicationContext.xml中配置切点/处理切面等数据(项目中此文件名称会变化);
 若是是对controller进行拦截出,在servlet.xml中配置切点/处理切面等数据(项目中此文件名称会变化);
具体不一样主要是由于controller和service/dao的初始化时间不一致,若是配置错误,将不能对对应的类进行正确的aop加强,致使aop无效(能够参考代理的原理)。
2 hibernate的session问题:
   在ssh环境中,为了保证session的一致性,spring经过filter在请求建立时对线程进行了绑定,保证controller/service/dao使用的是同一个session;可是若是咱们使用线程池建立线程对数据进行处理,不存在绑定问题,在查询实体关联属性的时候会出现session提早关闭。具体异常如could not initialize proxy - no Session(即便你使用官方ThreadLocal绑定session,可是在dao拿到的session和此时绑定的必然不同),解决方法,以下:
  // 建立session给TransactionSynchronizationManager
    /**reference OpenSessionInViewFilter.doFilterInternal*/
    public void sessionToSpring() {
        // single session mode
        if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
            // Do not modify the Session:
        } else {
            Session session = getSession(sessionFactory);
            TransactionSynchronizationManager.bindResource(sessionFactory,
                    new SessionHolder(session));
        }
    }
    // 建立session
    /**copy OpenSessionInViewFilter.getSession*/
    public Session getSession(SessionFactory sessionFactory) {
        Session session = SessionFactoryUtils.getSession(sessionFactory, true);
        FlushMode flushMode = FlushMode.MANUAL;
        if (flushMode != null) {
            session.setFlushMode(flushMode);
        }
        return session;
    }
    // 关闭
    /**reference OpenSessionInViewFilter.doFilterInternal*/
    public void sessionClose() {
        SessionHolder sessionHolder =
                (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
        SessionFactoryUtils.closeSession(sessionHolder.getSession());
    }spring

相关文章
相关标签/搜索