我们在做项目的时候,总是会考虑对每一个操作打开一个新的session,然后对session进行单独的操作,然后关闭session。
如果,我在整个项目运行的时候,都是通过一个session来进行,也就是说,所有的操作都是在一个session中进行,而这个session是不关闭的,只有等到tomcat
关闭的时候session才关闭,这样会出问题吗?
用一个session来管理缓存,这样效率高吗?

解决方案 »

  1.   

    tomcat关闭的时候session才关闭,这样会出问题吗?
    这样会使系统不安全.而且效率非常的低.
    如果你闲麻烦就用spring的事务管理.
    几行配置就搞定..
      

  2.   


    现在的问题是,由于整个项目都是在同一个session中运行,怎么才可以让项目在tomcat关闭之前把session关闭。
      

  3.   

    不可以
    简单的说,web程序是运行在一个多线程环境中,session是线程安全的,session不应跨线程访问。
    至于说tomcat关闭的事后做些什么是没问题的,javax.servlet.ServletContextListener就可以干
      

  4.   

    web应用程序一定是多线程的。而session不是线程安全的。
    如果所有的请求在访问数据库时,都用一个session,会产生非常严重的资源争用问题。sessionFactory是线程安全的,相应的它的成本也比较高,在每一个线程中,从线程安全的sessionFactory得到session,才是正确的做法。
    session作为jdbcConnection的一个高级封装,应该在事务边界范围外,尽晚得到尽早释放。一般的项目,如果用支持声明式事务的javaEE容器,事务边界都在biz层。容器会帮助你保证session的范围。
    楼主你现在是在异想天开,你还不知道正常的应用是什么样子。再多看看书吧。
      

  5.   

    在项目中只用一个session是不可取的。Hibernate作为一个轻量级框架,创建和关闭一个session是不会影响系统性能的。而且对每一个业务(用户的一次操作)创建一个session也方便事务的管理。
    对于缓存问题,SessionFactory,也就是Hibernate的第一级缓存,它的创建是一个很耗时的过程,在系统启动或第一次访问时创建,具体的创建过程我们不用关心,对于Session,Hibernate的第二级缓存,当提交事务时会自动清理缓存,或手动clear。
      

  6.   

    session是多线程可以创建多个实例,理论上session是现成安全的,一个线程只用一个实例,就是要避免多个线程共享一个session;
    如果用一个线程共享数据的时候.用session.flush(强制缓存与数据库同步更新时候会出现混乱的,容易出错;可以把想共享的数据放在二级缓存中,能够一次运行的就用session处理;
    优化还可以设置清理缓存的级别:
    session.setFlushMode(FlushMode.COMMIT):
    FlushMode.COMMIT只在递交的时候,清理缓存,在只是查询无修改的状况下用此模式,会节省资源;
    FlushMode.AUTO,默认,保持数据的顺序;
      

  7.   


    我说的嘛,看了上面的回答说session是线程安全的,我还在怀疑呢。。session不是线程安全的,而且是轻量级的对象,放心的new吧。
      

  8.   


    现在我就是不知道在多线程的环境下会不会出问题,但是,共用一个session也是有好处的啊,例如,我们就没有脱管对象了,这样,我们的每次对对象的操作就可以直接从session缓存里面拿,而且拿到的对象都是持久化的,而每次修改都会直接存入数据库,我们只需要控制session.flush()跟事务就可以很好地实现数据的存储。
    我知道session是一个轻量级的资源,但是是不是线程安全的我就不知道了。不知道我这么想对不对?
      

  9.   


    现在我就是不知道在多线程的环境下会不会出问题,但是,共用一个session也是有好处的啊,例如,我们就没有脱管对象了,这样,我们的每次对对象的操作就可以直接从session缓存里面拿,而且拿到的对象都是持久化的,而每次修改都会直接存入数据库,我们只需要控制session.flush()跟事务就可以很好地实现数据的存储。
    我知道session是一个轻量级的资源,但是是不是线程安全的我就不知道了。不知道我这么想对不对?
      

  10.   

    sessionFactory本身是个session池,可以说在里面拿个session不会有太大影响,而且也容易管理
      

  11.   

    session的创建还是比较消耗资源的,其实一开始lz的想法是可以采用的,就是建立session管理器,或者session池。这样的功能一般的应用服务器都会有实现,所以lz不需要自己动手实现,可以考虑使用应用服务器的数据源方式连接数据库。把管理session的功能交给服务器这样比较好。
      

  12.   

    Session级缓存是内部缓存,也就是一级缓存
    SessionFactory级的缓存才是二级缓存!!!
      

  13.   

    session不关闭是个非常不好的事情,
    要是业务请求不多倒是不会出现什么问题
    你要是做的系统稍微大一些,请求多而复杂
    你到运行测试时就会出现意想不到的错误所以建议你对session进行控制和管理
    我的习惯是在业务层专门建立一个session的管理类,里面负责对session进行管理
    其他的业务请求处理类直接调用就可以了
      

  14.   

    session是一级缓存,不应该让session共享.可以用ThreadLocal类为每一个线程配一个session.
      

  15.   

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();这种用法呢?
      

  16.   

    spring 有非常完善的 hibernate 管理机制 用spring hibernate模板来管理 你不用考虑这些问题 事物问题也非常好解决,只需要配置
      

  17.   

    本人一直都是把session交给spring来管理