如何强制NHibernate识别未通过NHibernate进行的数据库更改

时间:2008-10-29 16:01:43

标签: asp.net nhibernate caching

我正在将NHibernate实现到现有的Web应用程序中。但是,我们还有一些其他进程可以在数据库上进行批量插入和更新。如何让NHibernate意识到后端数据库中发生的更改不是通过NHibernate启动的?

我在asp.net中使用NHibernate的大部分信息都提到将Session对象存储在HttpContext或CallContext中。然后,这将在应用程序生命周期的持续时间内存储会话对象。这是我实施的。我害怕在每个请求上初始化NHibernate的成本。在每个请求上初始化Session对象时,这种方法不会对性能造成重大影响吗?

此外,将SessionFactory存储在HttpContext或CallContext中是否更有意义,以便不必在每个请求上重新生成映射?

3 个答案:

答案 0 :(得分:12)

你不应该。 NHibernate会话可以帮助您在ACID环境中工作,这意味着一个事务不知道任何并发事务。您应该使用执行少量操作的短会话。你不应该长时间举行会议。如果您确实需要很长一段时间来处理域对象,那么您应该分离然后将域对象重新附加到不同的会话中。

打开新会话后,在会话打开之前对数据库所做的任何更改都将通过NHibernate提供。

答案 1 :(得分:4)

您不应将会话存储在多个请求中。糟糕,糟糕的主意。

在每次通话中重新创建它几乎没有开销。它应该使用数据库连接池 - 这是大量开销的地方。

答案 2 :(得分:4)

默认情况下,NHibernate不会在会话之间缓存任何内容。如果您的会话是短暂的(根据请求),您不必担心。

如果您正在使用二级缓存或查询缓存,则可能需要手动刷新缓存。 SessionFactory.Evict或SessionFactory.EvictQueries应该有帮助。重新启动应用程序也应该这样做,但这可能不是您正在寻找的答案。

在ASP.NET应用程序中,我看到的一般用法是为应用程序创建一个SessionFactory,并为每个请求创建一个新的Session。

SessionFactory需要一段时间来初始化,是线程安全的,只需要初始化一次。

会话不是线程安全的,而且创建起来非常快。

存储在HttpContext中的任何内容只会在请求的长度内保持活动状态。在上下文中存储会话是正常的,应该给你想要的结果。 SessionFactory通常存储在一个静态变量中,并且会持续与app一样长。

有关示例,请参阅the NHIbernateHelper class here

相关问题