Можно ли перехватить все SQL-запросы DataNucleus JDO? - PullRequest
1 голос
/ 09 марта 2012

Предполагая, что у каждого есть работающее приложение Java, использующее реализацию DataNucleus JDO для доступа к базе данных, возможно ли перехватить все запросы SQL, сделанные к базе данных? Намерение состоит в том, чтобы вести статистику по ним и вести журнал / трассировку.

Ответы [ 2 ]

4 голосов
/ 10 марта 2012

Вы можете легко получить журналы всех операторов SQL из DataNucleus, включив категорию DataNucleus.Datastore.Native (см. http://www.datanucleus.org/products/datanucleus/logging.html)

JDO2 InstanceLifecycleListeners позволит вам перехватывать события, но я не думаю, чтотам будут доступны операторы SQL ...

Вы также можете обратиться к своему серверу приложений за инструментами профилирования SQL.Например, GlassFish позволяет вам присоединять реализации SQLTraceListener к вашим пулам соединений. См. http://docs.oracle.com/cd/E18930_01/html/821-2418/giyck.html#giygg

0 голосов
/ 06 мая 2015

Log4j

Вы можете использовать java.util.logging или Log4j с DataNucleus. Я собираюсь рассказать о конфигурации Log4j.

log4j.properties

# Define the destination and format of our logging
log4j.rootCategory=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{1}:%M:%L - %m%n

# DataNucleus Categories
log4j.category.DataNucleus=ALL

Последняя строка назначает порог уровня для INFO или ALL, чтобы увидеть все журналы DataNucleus. DataNucleus использует серию категорий и регистрирует все сообщения в этих категориях. Смотрите здесь для более подробной информации. Вам, вероятно, нужно

  • log4j.category.DataNucleus.Query - Все сообщения, относящиеся к запросам
  • log4j.category.DataNucleus.Datastore - Все общие сообщения хранилища данных
    или
  • log4j.category.DataNucleus.JDO - Все общие сообщения для JDO

log4j.category.DataNucleus является корнем всех категорий журналов DataNucleus.

Добавьте log4j к вашему CLASSPATH. Я использую Gradle для управления зависимостями, поэтому вот мой скрипт сборки:

build.gradle

configurations {
    all*.exclude group: "commons-logging", module: "commons-logging"
}

dependencies {
    // Logging
    compile 'org.slf4j:slf4j-api:1.7.+'
    runtime 'org.slf4j:slf4j-jdk14:1.7.+'
    runtime ('log4j:log4j:1.2.17') {
        exclude group: "com.sun.jdmk", module: "jmxtools"
        exclude group: "com.sun.jmx", module: "jmxri"
        exclude group: "javax.mail", module: "mail"
        exclude group: "javax.jms", module: "jms"
    }    
}

Чтобы предоставить файл конфигурации Log4J при запуске приложения, установите параметр JVM как

-Dlog4j.configuration=file:log4j.properties

Это может быть сделано для вас, если вы работаете на сервере приложений JavaEE. Или, если вы используете Spring WebMVC, поместите log4j.properties в WEB-INF и добавьте следующий слушатель в дескриптор развертывания.

web.xml

<!-- The definition of the Log4j Configuration -->
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
...