Java Session.close()对Spring openSessionInView有影响吗?

Java Session.close()对Spring openSessionInView有影响吗?,java,hibernate,spring,open-session-in-view,Java,Hibernate,Spring,Open Session In View,我在web.xml中有openSessionInView过滤器 <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> 那么此会话关闭是否会在op

我在web.xml中有
openSessionInView
过滤器

<filter>
    <filter-name>openSessionInView</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
那么此会话关闭是否会在
openSessionInView
中产生任何问题

另一个问题: 这是执行各种hibernate操作的好方法吗?在上述代码中,实体
User
有一个获取配置文件


谢谢和问候。

是的,这会引起问题。通过使用筛选器,您可以声明会话是在外部管理(创建和关闭)的。因此,如果您自己关闭它,外部机制将不起作用(并且可能引发异常)

如果getAllUsers()是请求生命周期中最后要做的事情,那么这种方法是可以接受的。但是,如果您想执行更多的数据库操作,那么您必须打开一个新会话,因为您已经关闭了它。此外,如果您不关闭会话,它将被筛选器关闭:

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

...// sf is SessionFactory

            sf.getCurrentSession().beginTransaction();

            // Call the next filter (continue request processing)
            chain.doFilter(request, response);

            sf.getCurrentSession().getTransaction().commit();

...
        }

谢谢如果我删除session.close,那么就可以了!我应该在transaction begin close中执行每个单元操作吗?因为您使用的是spring,所以也可以使用spring事务管理。检查文档:@Erhan Bagdemir我了解到如果我们在HibernateDaoSupport属性中将allowCreate声明为true,getSession()将返回一个新会话。我在想这对多用户同时访问的网站有影响吗?如果仍然可以通过同步保护您的代码不受多个请求(线程)的影响。@Erhan Bagdemir,因此建议通过添加synchronized关键字来编写数据库保存/更新/删除的同步方法。不是吗?因此,如果您启动一个事务并在其中执行操作,其他请求就不会有问题,因为ACID(工作单元)规则。如果您使用openSessionInView模式,那么对于每个请求,您只有一个事务。此事务中的所有操作都将被隔离。如果在方法中启动事务并在其中提交,则可以使用sync保护对此方法的多重访问。在DAO中。@Erhan Bagdemir到目前为止我所了解的是,如果DAO的每个方法都是同步的,并且所有的单元操作都是在事务开始关闭时完成的,如果会话在开始时(通过getSession)打开并在方法结束之前关闭,那么它在openSessionInView中不会产生任何问题。我说得对吗?
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

...// sf is SessionFactory

            sf.getCurrentSession().beginTransaction();

            // Call the next filter (continue request processing)
            chain.doFilter(request, response);

            sf.getCurrentSession().getTransaction().commit();

...
        }