Hibernate 中的openSession和GetCurrentsession之间的差异
时间:2020-02-23 14:34:08 来源:igfitidea点击:
我们可能知道有两种方法可以在Hibernate中创建或者获取会话。
我们在sessionFactory类中有以下两种方法来创建会话。
openSession
当我们调用sessionFactory.opensession时,它始终重新创建新的会话对象并将其交给我们。
我们需要显式刷新并关闭这些会话对象。
随着会话对象不是线程安全的,我们需要在多线程环境中每个请求创建一个会话对象,也需要在Web应用程序中每个请求的一个会话。
getcurrentsession
当我们调用SessionFactory时。
GetCurrentsession,它将提供我们在Hibernate上下文中的会话对象,并在内部由Hibernate管理。
它符合交易范围。
当我们调用SessionFactory时。
GetCurrentsession,它会创建一个新的会话,如果不存在,否则使用相同的会话在当前的Hibernate上下文中。
它在交易结束时自动刷新和关闭会话,因此我们无需在外部执行。
如果在单线程 环境中使用Hibernate,则可以使用GetCurrentsession,因为它的性能更快,与每次创建新的会话相比。
我们需要将以下属性添加到hibernate.cfg.xml以使用GetCurrentsession方法。
<session-factory> <!-- Put other elements here --> <property name="hibernate.current_session_context_class"> thread </property> </session-factory>
如果未配置上述属性,则会收到以下内容。
Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured! at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012) at com.arpit.theitroad.hibernate.HibernateSessionExample.main(HibernateSessionExample.java:14)
Opensession vs getCurrentsession:
让我们总结下表中的Opensession和GetCurrentsession之间的差异
参数 | Opensesession | getcurrentsession |
---|---|---|
会话对象 | 它始终创建新的会话对象 | 它创建一个新的会话,如果不存在,否则使用相同的会话在当前的hibernate上下文 |
Flush和关闭 | 我们需要明确刷新和关闭会话对象 | 我们不需要刷新和关闭会话对象,它将在内部Hibernate 自动处理 |
性能 | 在单线程 环境中,它比getCurrentsession 慢 | 在单线程 环境中,它比getopensession 更快 |
配置 | 我们无需配置任何属性可调用此方法 | 我们需要配置其他属性“hibernate.current_session_context_class ”来调用getCurrentsession方法,否则会抛出异常。 |