Ведение журнала PreparedStatements в Java

Вы можете присоединиться к двум коллекциям в Монго, используя поиск, который предлагается в версии 3.2. В вашем случае запрос будет

db.comments.aggregate({
    $lookup:{
        from:"users",
        localField:"uid",
        foreignField:"uid",
        as:"users_comments"
    }
})

, или вы также можете присоединиться к пользователям, тогда будет небольшое изменение, как указано ниже.

db.users.aggregate({
    $lookup:{
        from:"comments",
        localField:"uid",
        foreignField:"uid",
        as:"users_comments"
    }
})

Он будет работать так же, как левое и правое соединение в SQL.

14
задан kolrie 9 March 2009 в 23:44
поделиться

3 ответа

Я попробовал log4jdbc , и он помог мне.

ЗАМЕЧАНИЕ ПО БЕЗОПАСНОСТИ: С сегодняшнего августа 2011 года записанные в журнал результаты подготовленного оператора log4jdbc НЕ БЕЗОПАСНЫ для выполнения. Их можно использовать для анализа, но НИКОГДА не следует отправлять обратно в СУБД.

Пример журнала, созданного logjdbc:

12.08.2010 16:30:56 jdbc.sqlonly org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate (DelegatingPreparedStatement.java:105) 8. ВСТАВИТЬ В ТАБЛИЦУ (ID_FILE, CODE1, ID_G, ID_SEQUENCE, REF, NAME, BAR, DRINK_ID, AMOUNT, DESCRIPTION, STATUS, CODE2, REJECT_DESCR, ID_CUST_REJ) ЦЕННОСТИ (2, '123', 1, '2', 'aa', 'awe', null, '0123', 4317.95, 'Rccc', '0', null, null, null)

Библиотека очень легко настроить:


Моя конфигурация с HSQLDB :

jdbc.url=jdbc:log4jdbc:hsqldb:mem:sample

С Oracle :

jdbc.url=jdbc:log4jdbc:oracle:thin:@mybdd:1521:smt
jdbc.driverClass=net.sf.log4jdbc.DriverSpy

logback.xml:

<logger name="jdbc.sqlonly" level="DEBUG"/>

Жаль, что его не было в репозитории maven , но все же полезно.
Из того, что я пробовал, если вы установите

, вы получите только ошибочные операторы, однако я не знаю, влияет ли эта библиотека на производительность.

6
ответ дан 1 December 2019 в 15:02
поделиться

Это очень зависит от базы данных. Например, я понимаю, что некоторые драйверы JDBC (например, sybase, возможно, ms-sql) обрабатывают подготовленные операторы, создавая временную хранимую процедуру на сервере, а затем вызывая эту процедуру с предоставленными аргументами. Таким образом, полный SQL никогда не передается от клиента.

В результате JDBC API не раскрывает нужную информацию. Возможно, вы сможете преобразовать свои объекты операторов во внутреннюю реализацию драйвера, но, вероятно, нет - ваш сервер приложений вполне может обернуть операторы в свою собственную реализацию.

Я думаю, вам, возможно, придется просто укусить пулю и написать свой собственный класс, который интерполирует аргументы в заполнитель SQL. Это будет неудобно, потому что вы не можете запросить PreparedStatement параметры, которые были установлены, поэтому вы

3
ответ дан 1 December 2019 в 15:02
поделиться
  1. Если вы используете MySQL, PreparedStatement.toString () соединителя MySQL включает связанные параметры . Хотя сторонние пулы соединений могут нарушить это.

  2. Подкласс PreparedStatement для создания строки запроса по мере добавления параметров. Невозможно извлечь SQL из PreparedStatement, поскольку он использует скомпилированную двоичную форму.

LoggedPreparedStatement выглядит многообещающе, хотя я не пробовал.

Одно из преимуществ этого перед прокси-драйвером, который регистрирует все запросы заключаются в том, что вы можете изменить строку запроса перед ее записью. Например, в среде PCI вы можете захотеть замаскировать номера карт.

0
ответ дан 1 December 2019 в 15:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: