假设有一个可操作的Java应用程序使用DataNucleus的JDO实现来访问数据库,是否可以拦截对数据库进行的所有SQL查询?目的是对它们运行统计并保留日志/跟踪。
答案 0 :(得分:4)
您可以通过启用DataNucleus.Datastore.Native类别轻松获取DataNucleus中所有SQL语句的日志(请参阅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
答案 1 :(得分:0)
您可以将java.util.logging或Log4j与DataNucleus一起使用。我将讲述Log4j的配置。
log4j.properties
Date {Thu May 07 2015 00:00:00 GMT+0700 (SE Asia Standard Time)}
最后一行为INFO或ALL分配一个级别阈值,以便查看所有DataNucleus日志。 DataNucleus使用一系列类别,并将所有邮件记录到这些类别。 See here了解更多详情。你可能需要
# 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
- 与查询相关的所有讯息log4j.category.DataNucleus.Query
- 所有常规数据存储消息log4j.category.DataNucleus.Datastore
- JDO的所有消息 log4j.category.DataNucleus.JDO
是所有DataNucleus日志类别的根。
将log4j添加到CLASSPATH。我使用Gradle进行依赖关系管理,所以这是我的构建脚本:
的build.gradle
log4j.category.DataNucleus
要在启动应用程序时提供Log4J配置文件,请将JVM参数设置为
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"
}
}
如果您在JavaEE应用程序服务器中运行,则可以为您完成此操作。或者,如果您使用的是Spring WebMVC,请将log4j.properties放在WEB-INF中,并将以下侦听器添加到Deployment描述符中。
的web.xml
-Dlog4j.configuration=file:log4j.properties