java Web应用程序是否只包含一个hibernate会话以及如何清除此hibernate会话?

时间:2014-09-09 07:04:44

标签: java spring hibernate

我在一个请求中保存和检索数据库中的对象时遇到问题。 我想清除hibernate会话的缓存,以便在我们的数据库中获取更新的实体。 我的代码如下所示:

public class SampleController{
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
        throws Exception {
        myServiceOne.doAllotsOfSaving(parameters);
        //some code enhancements to remove cache in hibernate session
        //without affecting the session of other user logged in.

        //some fields in MyEntity class contains the old values but the actual data in database is already updated

        MyEntity entity = myServiceTwo.getMyEntityByOrderNo(orderNo);
    }
}
--configurations
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    <property name="hibernateProperties">
        <ref local="hibernateProperties"/>
    </property>
    <property name="entityInterceptor">
        <ref bean="auditLogInterceptor" />
    </property>
</bean>

<bean id="myServiceOne" class="com.test.service.impl.MyServiceOneImpl">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="myServiceTwo" class="com.test.service.impl.MyServiceTwoImpl">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
--configurations

2 个答案:

答案 0 :(得分:1)

Session factory是一个长期multithreaded对象。 通常一个session factory should be created for one database

Session用于获取与数据库的物理连接。 Session对象是轻量级的,旨在每次与数据库进行交互时进行实例化。

Session的主要功能是为映射实体类的实例提供CRUD操作。在给定的时间点,实例可能存在以下三种状态之一:

transient :aa持久化类的新实例,它与Session无关,并且在数据库中没有任何表示,并且transient不会将Hibernate视为{ {1}}。

持久性:您可以通过将临时实例与Session相关联来使其持久化。 persistent实例在数据库中有一个表示,一个标识符值,并与Session相关联。

分离:关闭Hibernate会话后,持久化实例将成为detached个实例。

答案 1 :(得分:1)

java web应用程序是否只包含一个hibernate会话以及如何清除此hibernate会话?

任何基于hibernate的应用程序都不能使用多个会话。必须在执行任务时关闭其中的每个会话。如果在hibernate的配置文件中配置相同的Hibernate,可以为您管理会话。 但是,每个应用程序只应有一个SessionFactory个实例。

要清除会话,您可以调用session.clear()方法。它清除会话级缓存。

,不会影响其他用户登录的会话

由于您有一个Web应用程序,因此每个用户都有一个不同的线程用于数据库事务。这意味着每个用户将拥有不同的休眠会话,因此您不必担心这一点。如果通过某些方式你为所有用户使用相同的会话,那么你做错了,结果可能是灾难性的。一段时间后,由于会话级缓存,您将获得OutOfMemoryError

您必须注意,您无法禁用hibernate会话级缓存。为此,您可以使用StatelessSession