在自己的方法开头,总是打开一个session,在结尾就关闭,但解决不了延时加载时带来的一大串麻烦,比如说session已关闭,或是连接多起来的时候,直接把服务器给搞瘫痪了。来个朋友说下session的创建原理,再说个管理方案,我在论坛里看过,但还是觉得很抽象。我希望的是一用户一个session,这样不会消耗太多资源吧?顺便讲个延时加载的原理,究竟是在方法后去查数据库还是同时进行的?例如用户表有个字段是角色ID,配置的时候,角色表lazy="flase",在DAO层有一方法查所有用户的,我是知道,是这方法执行完了,再去加载角色表的对应信息还是同时进行的? 还有,查用户和查角色用的是同一个session吗?

解决方案 »

  1.   

    请使用spring的OpenSessionInViewFilter
      

  2.   

    你把lazy属性设置为false(楼主貌似写错了),就是要求查询用户的时候同时加载角色,
    他们肯定是再同一个session中,当加载用户信息的时候,它没有发现对角色进行懒加载,
    hibernate会进行查询角色,你可以配置下hibernate的show_sql查看sql语句就知道了
      

  3.   

    连接多的时候把服务器搞瘫痪,这里我要问你,用连接池了吗?
    如果使用Spring的话,session的创建和销毁不需要你代码处理,懒加载问题也可以用OpenSessionInView解决。但你Spring要会用啊,这一两句说不清楚
    如果不用Spring,绝对不要每个方法都创建和销毁一次session。可以在表示层的方法中手动打开Session,放在ThreadLocal里,用它执行业务代码,离开方法前关掉。这样你的懒加载问题可以一定程度解决,但那些在写JSP页面时才初次懒加载的属性还是会失败,你可以在持久层给有可能需要懒加载属性的查询方法,多写一个重载,用一个boolean变量标识是否需要立刻初始化被懒加载的属性。
      

  4.   

    一直没用连接池- -  先试下spring的OpenSessionInView