1

我正在做一个需要以下内容的项目:

  • 从特定的 NHibernate 3.2 会话中提取完整的 SQL 查询。
  • 对查询执行特定操作(即不必记录它)
  • 不影响整个系统的NHibernate,避免引入性能问题

我检查了几种方法,其中许多已经出现在 StackOverflow 上。这是我现在看到的选项:

手动的

在最幼稚和最烦人的解决方案中,我可以只遵循业务逻辑并自己构建查询 - 例如,如果 BL 构建了一个对 ID=5 进行限制的条件,我将使用SELECT ... WHERE ID = 5. 由于我们有一个相当复杂的 BL,我真的很想避免这种情况。

NHibernate 拦截

最初,使用OnPrepareStatement似乎是最好的选择。但是,我很快发现查询的参数没有被记录,这使得它变得毫无用处。

内省 NHibernarnate 的 ICriteria

当使用 NHibernate 执行查询时,我们使用包含限制、排序和聚合定义的 ICreteria 对象来执行此操作。似乎我可以在此处描述的 CriteriaWalker 时对其进行检查。但是,它似乎对复杂的查询感到困惑。此外,在某些情况下,我们使用 NHibernate 3 新的“QueryOver”语法,这个解决方案对我没有帮助。

使用 ILoggerFactory

从 NHibernate 3 开始,您可以编写自定义日志工厂(示例)。这得到了完整的 SQL,但是,它也影响了整个 NHibernate 系统,似乎不可能有工厂来申请特定的 ISession,甚至是 ISessionFactory。

自定义 NHibernate 驱动程序

我考虑过编写代理 NHibernate 驱动程序并将其分配给特定的 SessionFactory(如此所述)。但是,友好的评论警告说它在 Nhibernate 3.2 中的工作时间更长。

使用动态代理

此代码使用 Castle 的动态代理将自身注入到 ISession 中。我还没有尝试在我的服务器上运行它,但我对使用这种激烈的措施有点警惕。但是,如果没有其他方法可行,我想这是需要考虑的事情。

建议?

现在我有点坚持选择最好的方式,因为似乎没有什么在做它的工作,完全正确。如果还有其他建议,我很想听听。

4

1 回答 1

2

我将使用标准或自定义日志框架,并应用自定义过滤器从线程数据中检索标志(例如),以确定是否应记录会话。

这样,您根本不会弄乱 NH 内部,只要您不设置标志,就不会记录任何内容。

于 2013-03-29T19:09:15.500 回答