2012-02-08 60 views
2

我使用流畅的NHibernate和Sqlite来构建一个winform系统。系统启动时有很多线程在运行。所以我使用每个会话的每个线程策略来解决会话并发问题。然后我发现不同会话之间的数据不一致。所以,我开始使用二级缓存来共享不同会话中的数据。但是,我仍然发现我通过一个会话更新对象,然后通过另一个会话获取更新的对象,我发现返回的对象是陈旧的。 我猜想,当数据更新时,二级缓存不会通知第一级缓存。如何解决它?不同会话之间的NHibernate数据不一致

配置:

  1. 第二级缓存提供:NHibernate.Caches.SysCache

  2. 流利映射:Cache.ReadWrite();在类图

+0

显示您的一些数据访问代码可能会帮助我们帮助您。 – Maggie 2012-02-08 03:16:49

回答

1

您应该将每个会话用作工作单元。完成后,处置它,并获得您需要的下一个会话中的新会话。

+0

但是,在winform应用中,很难找到合适的会话配置机会 我认为我们可以配置在二级缓存更新时通知每个会话缓存。知道如何配置它? – 2012-02-08 03:45:09

+0

会话是一个工作单元。 – RKitson 2012-02-08 03:54:21

+0

一点都不难。通常你的用户请求数据。一旦你检索了它,你就不需要这个会话。然后你的应用程序拥有它并且它们可以工作有一段时间,如果他们保存,这是另一个UoW。再次,当你完成处置。 – Andy 2012-02-08 03:57:02

0

您的更改实际上使它到数据库的唯一方法是通过会话刷新。

有3个事件导致会话刷新: 1.通过调用session.flush()告诉它; 2.会话正在关闭 3.选择语句即将执行

如果您尚未触发刷新,那么您的数据还不在数据库中。

+0

感谢您的回答。 我在提交事务时刷新会话。我确信第一次会议将数据更新到数据库。问题在于其他会话不是从第二级缓存更新对象,而是从会话缓存中获取旧数据。我猜想二级缓存在数据更新时不会通知第一级缓存。 更多理想?提前致谢。 – 2012-02-08 03:36:58

+0

你为什么确定?你是否在适当的时候检查了数据库的正确值? (即在第二次会话中选择数据之前添加一个断点并实际查看数据库中的数据? – RKitson 2012-02-08 03:56:21

+0

是的,我检查了数据库,我想我应该找到配置会话高速缓存刷新策略的方法。 ,我不知道如何配置 – 2012-02-08 05:51:36