2013-03-28 2 views
1

Мы используем NHibernate 3.2.Nhibernate - использование ведения журнала для конкретного ISession или ISessionFactory

Я хотел бы иметь возможность регистрировать SQL-запросы из определенного ISession. Это возможно?

В качестве альтернативы, если это невозможно, могу ли я установить регистратор на конкретный ISessionFactory? Тогда я мог бы создать этот ISession с этой конкретной фабрики.

Из того, что я видел, чтобы установить регистратор, вы должны сделать что-то подобное:

<appSettings> 
     <add key="nhibernate-logger" value="NH3SQLLogger.LoggerFactory, NH3SQLLogger" /> 
</appSettings>  

Однако, что бы сделать настройки глобальной для всех заводов.

Могу ли я сделать что-то вроде этого:

 var config = new Configuration(); 
     config.Configure(); 
     config.SetProperty("nhibernate-logger", 
         "NH3SQLLogger.LoggerFactory, NH3SQLLogger"); 
     _sessionFactory = config.BuildSessionFactory(); 

будет работать? Или есть другой способ?

ответ

4

Нет, вы можете указать только регистратор по всему миру. Делать то, что вы хотите, было бы довольно сложно.

Вам потребуется:

  1. Написать свой ILoggerFactory реализация
  2. лесозаготовительных Захват данных NHibernate.SQL, чтобы захватить все SQL
  3. лесозаготовительных Захват данных NHibernate.Impl.SessionImpl захватить какой ISession и ISessionFactory генерирует SQL.
  4. Запишите логику, чтобы игнорировать все SQL, кроме того, что было создано вашим именем ISessionFactory.

Вот код, чтобы вы начали:

public class LoggerFactory : ILoggerFactory 
{ 
    #region Implementation of ILoggerFactory 

    /// <summary> 
    /// Returns the logger for a given key name 
    /// </summary> 
    /// <param name="keyName">Key or class name</param> 
    /// <returns>Logger</returns> 
    public IInternalLogger LoggerFor(string keyName) 
    { 
     if (string.IsNullOrWhiteSpace(keyName)) 
      return new NoLoggingInternalLogger(); 

     switch (keyName) 
     { 
      case "NHibernate.SQL": 
       return new SqlLogger(); // Create this class to capture the SQL 
      case "NHibernate.Impl.SessionImpl": 
       return new SessionLogger(); // Create this class to capture ISession-related stuff 
      default: 
       return new NoLoggingInternalLogger(); 
     } 
    } 

    /// <summary> 
    /// Returns the logger for a given type 
    /// </summary> 
    /// <param name="type">Class name</param> 
    /// <returns>Logger</returns> 
    public IInternalLogger LoggerFor(Type type) 
    { 
     return LoggerFor(type.FullName); 
    } 

    #endregion Implementation of ILoggerFactory 
} 
+0

Спасибо за подробный ответ, Рэнди. Однако я немного опасаюсь этого решения, поскольку это будет означать, что этот регистратор будет выполняться для каждого сеанса в системе, что приведет к глобальному поражению производительности. Нет ли другого способа (например, без ведения журнала), чтобы получить полный SQL из определенного сеанса? – VitalyB

+0

Кроме того, если вы могли бы взглянуть на этот вопрос, последующий вопрос: http://stackoverflow.com/questions/15700406/getting-building-the-sql-with-parameters-from-nhibernate-3-2 Спасибо ! – VitalyB

+1

@VitalyB К сожалению, я не знаю другого способа получить доступ к полной строке и параметрам SQL-запроса. И да, создание клиента ILoggerFactory приведет к какому-то результату. Я тоже посмотрел на ваш следующий вопрос, но у меня нет ничего другого, чтобы внести свой вклад, поскольку мне никогда не приходилось делать что-либо подобное. Удачи вам, хотя! –

Смежные вопросы