¿Es posible interceptar todas las consultas SQL JDO de DataNucleus?

Suponiendo que uno tiene una aplicación Java operativa que utiliza la implementación de JDO de DataNucleus para acceder a una base de datos, ¿es posible interceptar todas las consultas SQL realizadas en la base de datos? La intención es ejecutar estadísticas sobre ellos y mantener un registro/rastreo.

preguntado el 09 de marzo de 12 a las 13:03

2 Respuestas

Puede obtener fácilmente registros de todas las instrucciones SQL de DataNucleus activando la categoría DataNucleus.Datastore.Native (consulte http://www.datanucleus.org/products/datanucleus/logging.html)

JDO2 InstanceLifecycleListeners le permitiría interceptar eventos, pero no creo que las declaraciones SQL estén disponibles allí...

También puede consultar su servidor de aplicaciones para obtener herramientas de generación de perfiles de SQL. Por ejemplo, GlassFish le permite adjuntar implementaciones de SQLTraceListener a sus grupos de conexiones. Ver http://docs.oracle.com/cd/E18930_01/html/821-2418/giyck.html#giygg

respondido 10 mar '12, 02:03

¿Es posible interceptar la carga del objeto de consulta (instanciación) usando un InstanceLifecycleListener? ¡Estoy usando LoadLifecycleListener, pero no detecta las consultas! :\ - marcolopes

Log4j

Puede usar el java.util.registro or Log4j con DataNucleus. Voy a hablar sobre la configuración de Log4j.

log4j.propiedades

# 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

La última línea asigna un umbral de nivel a INFO o ALL para ver todos los registros de DataNucleus. DataNucleus utiliza una serie de categoríay registra todos los mensajes en estas categorías. Mira aquí para más detalles. probablemente necesites

  • log4j.category.DataNucleus.Query - Todos los mensajes relacionados con las consultas.
  • log4j.category.DataNucleus.Datastore - Todos los mensajes generales del almacén de datos
    or
  • log4j.category.DataNucleus.JDO - Todos los mensajes generales a JDO

log4j.category.DataNucleus es una raíz de todas las categorías de registros de DataNucleus.

Agregar log4j a su CLASSPATH. yo suelo Gradle para la gestión de dependencias, así que aquí está mi script de compilación:

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"
    }    
}

Para proporcionar un archivo de configuración Log4J al iniciar su aplicación, establezca un parámetro JVM como

-Dlog4j.configuration=file:log4j.properties

Esto se puede hacer por usted si está ejecutando dentro de un servidor de aplicaciones JavaEE. O si está utilizando Spring WebMVC, coloque log4j.properties dentro de WEB-INF y agregue el siguiente oyente a su descriptor de implementación.

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>

Respondido el 20 de junio de 20 a las 10:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.