Журнал p6spy против журнала Hibernate

p6spy очень полезен для отладки запроса hibernate, но есть ли способ отформатировать запрос с той же логикой Hibernate?:

<property name="hibernate.format_sql" value="true" />

Пример журнала p6spy:p6spy - 1339663561390|15|0|statement|select personne0_.id as id5_,personne0_.dateNaissance as dateNais2_5_, personne0_.nom as nom5_, personne0_.prenom as prenom5_, personne0_.type as type5_ from Personne personne0_ where personne0_.nom=?|select personne0_.id as id5_, personne0_.dateNaissance as dateNais2_5_, personne0_.nom as nom5_, personne0_.prenom as prenom5_, personne0_.type as type5_ from Personne personne0_ where personne0_.nom='example'

Пример журнала Hibernate:

Hibernate: 
    insert 
    into
        TABLE
        (COLUMN_1, COLUMN_2) 
    values
        (?, ?)

Я думаю, что спящий формат более читабелен, и я хочу что-то подобное с p6spy.

Спасибо.

1 ответ

P6Spy захватывает оператор SQL и записывает его "как есть". Он вообще не пытается выполнять какое-либо форматирование. Тем не менее, P6Spy может быть легко расширен, чтобы иметь поведение, которое вы ищете. Как это работает, зависит от версии 1.3 и 2.0 (проще в 2.0).

1.3 - Подкласс какой бы регистратор вы в настоящее время не использовали, и переопределите метод logSQL(...). Например, если вы используете FileLogger, ваш подкласс может выглядеть примерно так, как показано ниже. Как только у вас будет скомпилированный класс в classpath, просто обновите spy.properties, чтобы использовать новую реализацию logger.

public class MyLogger extends FileLogger {
  public void logSQL(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
    super.logSQL(connectionId,now,elapsed,category,reformat(prepared),reformat(sql));
  }
  private String reformat(final String sql) {
    // formatting logic goes here
  }
}

2.0 - В 2.0 мы добавили новый интерфейс стратегии для обработки форматирования сообщений журнала. Это примерно тот же объем работы, что и при создании нового регистратора, но он будет использоваться всеми регистраторами. Вам просто нужно предоставить класс, который реализует интерфейс MessageFormattingStrategy. Чтобы заставить p6spy использовать новую стратегию, вы просто настраиваете ее в spy.properties или устанавливаете системное свойство. Смотрите документацию по конфигурации для уточнения. Для примера взгляните на MultiLineFormat.

Кстати, если вы создаете новую стратегию форматирования и хотите поделиться ею, отправьте нам запрос на извлечение. P6Spy теперь поддерживается на GitHub.

Другие вопросы по тегам