使用NHibernate重用线程的会话

时间:2012-12-15 20:01:37

标签: c# wpf multithreading nhibernate mvvm

我知道有关这个主题的几个主题已经讨论过了,因为我一直在阅读很多内容来尝试解决我的问题,但不知怎的,他们碰巧没有满足我的需求(可能是因为缺乏细节)。无论如何,如果您认为某些特定的“主题”可能有用,请将其链接。

我正在使用WPF(和MVVM)开发桌面应用程序,我正在使用NHibernate。在研究了管理会话的可能方法之后,我决定使用每个窗体的会话方法。通过这种方式,我认为我可以充分利用NHibernate的功能,如延迟加载,缓存等。 当我正在使用数据库时,我不想在加载或保存我的实体时冻结我的UI,所以我认为我应该使用专用线程(在每种形式中,我认为简化了开发)到处理数据库交互。但问题是我应该如何“重用”该线程(假设我有一个与该线程相关的会话)来进行“数据库调用”。

  • 我认为我不能使用TPL,因为我不能保证这两个任务会在同一个线程中运行(它甚至不能保证它们将在不同的线程中运行,而不是调用者)。
  • 我更喜欢使用session-per-form,因为我已经看过类似的讨论,最后使用会话或每次会话。但无论如何,如果你发现会话会话会更好,请告诉我(并希望解释原因)
  • 线程没有提供直接运行多个方法的方法,所以我想我必须'听'请求,但我仍然不确定我是否真的必须这样做以及我将如何使用'会话(并保存)仅在线程内。

编辑: 也许我遇到了这个问题,因为我把线程安全与其他东西混淆了。 当NHibernate文档说ISession实例不是线程安全的时候,这是否意味着如果两个线程同时尝试使用 ,我会(或可能)遇到麻烦,对吧?在我的情况下,如果我使用TPL,不同的线程可以使用相同的会话,但我不会同时在同一个会话中执行多个操作。那么,在那种情况下我会遇到麻烦吗?

1 个答案:

答案 0 :(得分:0)

如果我可以提出建议,桌面应用程序很难直接与数据库交互。通信没有加密,对于那些拥有最少技术诀窍的人来说,获取数据库密码并开始使用SQL连接搞乱记录并破坏数据库非常容易。

最好在桌面应用程序和数据库之间创建一个具有身份验证的Web服务,因为您可以为每个人创建凭据,并且每个事务都将被强制遵守您的各种业务规则。

这也会解决您的线程问题,因为您可以在另一个线程上创建HTTP连接,而对会话管理几乎没有任何麻烦。可能需要一个cookie值,而RestSharp使这一点变得相当简单。