zoukankan      html  css  js  c++  java
  • 解决noSession问题

    1.问题描述:对于根据id查询时,在dao通过load方式查询对象时,加载页面会报 noSession异常。

     严重: Servlet.service() for servlet [springDispatcherServlet] in context with path [/Xxxx] threw exception 
    
    [Request processing failed; nested exception is org.hibernate.HibernateException: No Session found for current thread] 
    
    with root cause
    org.hibernate.HibernateException: No Session found for current thread
        at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
        at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:988)
        at com.vincent.videosys.dao.BaseDao.getSession(BaseDao.java:17)
        at com.vincent.videosys.dao.UserDao.usernameExist(UserDao.java:29)
        at com.vincent.videosys.service.UserService.usernameExistService(UserService.java:19)
        at com.vincent.videosys.controller.home.UserController.usernameExist(UserController.java:40)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle

    2.问题分析:当使用hibernate框架操作数据库的时候,如果做查询的话会有立即加载(get)和延迟加载(load)的区别,延迟加载表示,当你查询某个数据(假设是对象)的时候,hibernate不会立马发送sql语句,而是当我们调用这个对象的属性的时候,也就是真正使用查询出来的数据的时候才会发送sql语句去一级缓存(即session,这里的session和域对象session没有半毛钱关系)中获取,但是正常这个session的开启核关闭是在service层执行的,但是我们真正使用查询的对象的数据时,是在web层,但是这个时候session已经关闭,就会报no-session异常。

              noSession分析图(右键"查看图像"查看原图)

    3.问题解决思路

      方案一:让session的关闭时间要在web层使用完之后。 但是web层已经是最后一层了,怎么办?还有比web更后的东西哦,就是过滤器 所以在web.xml中配置开启和关闭session的过滤器即可 ,但是要配在struts的过滤器之前,否则无效。

    <filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>

     

              添加过滤器解决noSession分析图

       使用load方法的解决方案 : 就是把原CustomerService层的绑定的session对象 提取配置到前面的 过滤器中了。

       方案二:

        load改用get立即加载方式查询对象。

    package cn.xdf.dao.impl;
    @Repository
    public class CustomerDaoImpl implements CustomerDao {
    
        @Autowired
        private HibernateTemplate hibernateTemplate;
    
        public void save(Customer customer) {
            hibernateTemplate.save(customer);
        }
    
        public List<Customer> findAll() {
            return (List<Customer>) hibernateTemplate.find("from Customer");
        }
    
        public void delete(Customer customer) {
            hibernateTemplate.delete(customer);
        }
        //根据id立即加载
        public Customer get(Long custId) {
            return hibernateTemplate.get(Customer.class, custId);
        }
        //根据id延迟加载-->用该方法会有问题(页面报错:noSession)
        public Customer load(Long custId) {  
            return hibernateTemplate.load(Customer.class, custId);
        }
    
        public void update(Customer customer) {
            hibernateTemplate.update(customer);
        }
    
        public List<Customer> findByCriteria(DetachedCriteria dc) {
            return (List<Customer>) hibernateTemplate.findByCriteria(dc);
        }
    }
  • 相关阅读:
    DOCKER启动失败Job for docker.service failed because the control process exited with error code. See "syste mctl status docker.service" and "journalctl -xe" for details.
    windows查看系统安装的补丁
    vue生命周期
    VUE 图片上传/剪切(vue-cropper)
    mysql性能优化关键点
    element vue-quill-editor 富文本编辑器 安装使用
    Module build failed: Error: Node Sass version 6.0.0 is incompatible with ^4.0.0.
    npm ERR! 404 You should bug the author to publish it (or use the name yourself!) npm ERR! 404 It was specified as a dependency of 'hr_front_end'
    __WEBPACK_AMD_DEFINE_ARRAY__ is not defined
    利用BERT得到句子的表示向量(pytorch)
  • 原文地址:https://www.cnblogs.com/zs-notes/p/9045977.html
Copyright © 2011-2022 走看看