- 浏览: 980883 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
P6Spy使用:http://donald-draper.iteye.com/blog/2319646
使用P6Spy的时候用到这一句我们来看这一句的内涵:
P6DataSource p6DSource = new P6DataSource(cpDSource)
初始化属性线路:初始化驱动及日志相关信息
P6DataSource,通过static语句块调用初始化方法initMethod(),initMethod()中一句很重要的
P6SpyDriverCore.initMethod((com.p6spy.engine.spy.P6SpyDriver.class).getName());再来看看P6SpyDriverCore
的initMethod的方法都做了什么事情
这里我们先来看一下p6spy的属性配置,再看P6LogFactory获取连接及日志
P6SpyProperties属性文件操作类:
P6SpyOptions配置选项类:set,get方法对应配置文件选项
自此属性文件配置线路完毕。
使用P6Spy的时候用到这一句我们来看这一句的内涵:
P6DataSource p6DSource = new P6DataSource(cpDSource)
// P6DataSource p6DSource = new P6DataSource(cpDSource) public class P6DataSource extends P6Base implements DataSource, Referenceable, Serializable { //source是通过构造传入的数据源c3p0或Druid public P6DataSource(DataSource source) { rds = source; } //初始化驱动及日志模块 public static void initMethod() { P6SpyDriverCore.initMethod((com.p6spy.engine.spy.P6SpyDriver.class).getName()); } //获取Connection public Connection getConnection() throws SQLException { if(rds == null) bindDataSource(); return P6SpyDriverCore.wrapConnection(rds.getConnection()); } protected DataSource rds; protected String rdsName; //通过static语句块调用初始化方法 static { initMethod(); } }
初始化属性线路:初始化驱动及日志相关信息
P6DataSource,通过static语句块调用初始化方法initMethod(),initMethod()中一句很重要的
P6SpyDriverCore.initMethod((com.p6spy.engine.spy.P6SpyDriver.class).getName());再来看看P6SpyDriverCore
的initMethod的方法都做了什么事情
public abstract class P6SpyDriverCore implements Driver { public static synchronized void initMethod(String spydriver) { if(initialized) return; String path = P6SpyProperties.getPropertiesPath(); if(path == null) { foundSpyProperties = false; return; } foundSpyProperties = true; //初始化spy.properties属性文件 P6SpyProperties properties = new P6SpyProperties(); P6SpyOptions coreOptions = new P6SpyOptions(); OptionReloader.add(coreOptions, properties); String className = "no class"; String classType = "driver"; try { //realdriver ArrayList driverNames = null; //日志模块 ArrayList modules = null; //获取驱动名 driverNames = P6SpyOptions.allDriverNames(); //获取所有日志模块 modules = P6SpyOptions.allModules(); boolean hasModules = modules.size() > 0; Iterator i = null; classType = "driver"; Driver realDriver; for(i = driverNames.iterator(); i.hasNext(); P6LogQuery.logDebug("Registered driver: " + className + ", realdriver: " + realDriver)) { P6SpyDriver spy = null; if(hasModules) { spy = new P6SpyDriver(); DriverManager.registerDriver(spy); } className = (String)i.next(); deregister(className); realDriver = (Driver)P6Util.forName(className).newInstance(); if(P6SpyOptions.getDeregisterDrivers()) //注册驱动realdriver=com.mysql.jdbc.Driver DriverManager.registerDriver(realDriver); if(hasModules) { spy.setPassthru(realDriver); realDrivers.add(realDriver); } } if(hasModules) { factories = new ArrayList(); classType = "factory"; com.p6spy.engine.common.P6Options options; for(i = modules.iterator(); i.hasNext(); P6LogQuery.logDebug("Registered factory: " + className + " with options: " + options)) { className = (String)i.next(); //module.log=com.p6spy.engine.logging.P6LogFactory //module.outage=com.p6spy.engine.outage.P6OutageFactory P6Factory factory = (P6Factory)P6Util.forName(className).newInstance(); factories.add(factory); options = factory.getOptions(); if(options != null) OptionReloader.add(options, properties); } } initialized = true; for(Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); P6LogQuery.logDebug("Driver manager reporting driver registered: " + e.nextElement())); } catch(Exception e) { String err = "Error registering " + classType + " [" + className + "]\nCaused By: " + e.toString(); P6LogQuery.logError(err); throw new P6DriverNotFoundError(err); } } //P6DataSource的getConnection方法条用P6SpyDriverCore的wrapConnection(Connection realConnection)方法 public static Connection wrapConnection(Connection realConnection) throws SQLException { Connection con = realConnection; if(factories != null) { for(Iterator it = factories.iterator(); it.hasNext();) { P6Factory factory = (P6Factory)it.next(); //这里是重点,这里是通过P6Factory来获取连接,P6SpyDriverCore //在初始化initMethod已经P6LogFactory,P6OutageFactory //module.log=com.p6spy.engine.logging.P6LogFactory //module.outage=com.p6spy.engine.outage.P6OutageFactory con = factory.getConnection(con); } } return con; } private String getRealUrl(String url) { if(P6SpyOptions.getUsePrefix()) return url.startsWith("p6spy:") ? url.substring("p6spy:".length()) : null; else return url; } public boolean acceptsURL(String p0) throws SQLException { String realUrl = getRealUrl(p0); boolean accepts = false; if(passthru == null && initialized) { if(realDrivers.size() == 0) throw new SQLException("P6 has no drivers registered"); findPassthru(realUrl); if(passthru == null) throw new SQLException("P6 can't find a driver to accept url (" + realUrl + ") from the " + realDrivers.size() + " drivers P6 knows about. The current driver is null"); } if(realUrl != null) accepts = passthru.acceptsURL(realUrl); return accepts; } protected Driver passthru; protected static boolean initialized = false; protected static ArrayList factories; [color=red] protected static ArrayList realDrivers = new ArrayList();[/color] protected static boolean foundSpyProperties; }
这里我们先来看一下p6spy的属性配置,再看P6LogFactory获取连接及日志
P6SpyProperties属性文件操作类:
public class P6SpyProperties { public static void initMethod() { //设置属性文件名 setSpyProperties(System.getProperty("spy.properties", "spy.properties")); } public P6SpyProperties() { File propertiesFile = new File(propertiesPath); if(propertiesFile.exists()) { long lastModified = propertiesFile.lastModified(); if(lastModified != propertiesLastModified) { propertiesLastModified = lastModified; //加载spy.properties文件 properties = P6Util.loadProperties(SPY_PROPERTIES_FILE); } else { properties = null; } } } public static String getPropertiesPath() { return propertiesPath; } //设置属性文件名 public static void setSpyProperties(String _properties) { SPY_PROPERTIES_FILE = _properties != null ? _properties : "spy.properties"; propertiesPath = findPropertiesPath(); propertiesLastModified = -1L; } protected static String findPropertiesPath() { String propertiesPath = P6Util.classPathFile(SPY_PROPERTIES_FILE); if(propertiesPath != null) { File propertiesFile = new File(propertiesPath); if(propertiesFile.exists()) return propertiesPath; } return null; } public Properties forceReadProperties() { File propertiesFile = new File(propertiesPath); if(propertiesFile.exists()) { long lastModified = propertiesFile.lastModified(); properties = P6Util.loadProperties(SPY_PROPERTIES_FILE); } return properties; } protected static final String OPTIONS_FILE_PROPERTY = "spy.properties"; protected static final String DFLT_OPTIONS_FILE = "spy.properties"; protected static String SPY_PROPERTIES_FILE; protected static long propertiesLastModified = -1L; protected static String propertiesPath; public Properties properties; //通过静态语句块调用initMethod方法 static { initMethod(); } }
P6SpyOptions配置选项类:set,get方法对应配置文件选项
public class P6SpyOptions extends P6Options { public static void setAutoflush(String _autoflush) { autoflush = P6Util.isTrue(_autoflush, false); } public static boolean getAutoflush() { return autoflush; } public static void setExclude(String _exclude) { exclude = _exclude; } public static void setExcludecategories(String _excludecategories) { excludecategories = _excludecategories; } public static void setFilter(String _filter) { filter = P6Util.isTrue(_filter, false); } public static void setIncludecategories(String _includecategories) { includecategories = _includecategories; } public static void setDeregisterDrivers(String trueOrFalse) { deregister = P6Util.isTrue(trueOrFalse, false); } public static void setLogfile(String _logfile) { logfile = _logfile; if(logfile == null) logfile = "spy.log"; } public static void setAppender(String className) { appender = className; } //实际驱动设置 public static void setRealdriver(String _realdriver) { realdriver = _realdriver; } public static void setRealdriver2(String _realdriver2) { realdriver2 = _realdriver2; } public static void setAppend(String _append) { append = P6Util.isTrue(_append, true); } public static boolean getAppend() { return append; } public static void setSpydriver(String _spydriver) { spydriver = _spydriver; if(spydriver == null) spydriver = "com.p6spy.engine.spy.P6SpyDriver"; } public static String getSpydriver() { return spydriver; } //设置日志日期格式 //dateformat=hh:mm:ss,SSS public static void setDateformat(String _dateformat) { dateformat = _dateformat; if(_dateformat == null || _dateformat.equals("")) dateformatter = null; else dateformatter = new SimpleDateFormat(_dateformat); } public static void setStringmatcher(String _stringmatcher) { stringmatcher = _stringmatcher; if(stringmatcher == null || stringmatcher.equals("")) stringmatcher = "com.p6spy.engine.common.SubstringMatcher"; try { stringMatcherEngine = (StringMatcher)P6Util.forName(stringmatcher).newInstance(); } catch(InstantiationException e) { P6LogQuery.logError("Could not instantiate string matcher class: " + stringmatcher); e.printStackTrace(); } catch(IllegalAccessException e) { P6LogQuery.logError("Could not instantiate string matcher class: " + stringmatcher); e.printStackTrace(); } catch(ClassNotFoundException e) { P6LogQuery.logError("Could not instantiate string matcher class: " + stringmatcher); e.printStackTrace(); } } //设置重新加载配置文件间隔 public static void setReloadPropertiesInterval(String _reloadpropertiesinterval) { reloadPropertiesInterval = P6Util.parseLong(_reloadpropertiesinterval, -1L); reloadMs = reloadPropertiesInterval * 1000L; } public static void setRealDataSource(String _realdatasource) { realdatasource = _realdatasource; } //当配置文件修改时,重新加载属性文件 public void reload(P6SpyProperties properties) { P6LogQuery.logDebug(getClass().getName() + " reloading properties"); modules = properties.getReverseOrderedList("module."); driverNames = properties.getReverseOrderedList("realdriver"); properties.setClassValues(com.p6spy.engine.common.P6SpyOptions.class); configureReloadingThread(); P6LogQuery.initMethod(); P6LogQuery.logInfo("reloadProperties() successful"); } //获取所有模块 public static ArrayList allModules() { return modules; } //获取所有驱动 public static ArrayList allDriverNames() { return driverNames; } protected static Thread reloadThread = null; protected static OptionReloader reloader = null; public static final String DRIVER_PREFIX = "realdriver"; public static final String MODULE_PREFIX = "module."; private static ArrayList modules; private static ArrayList driverNames; private static boolean usePrefix; private static boolean autoflush; private static String exclude; private static boolean filter; private static String include; private static String logfile; private static String appender; private static String realdriver; private static String realdriver2; private static String realdriver3; private static String spydriver; private static boolean append; private static String properties; private static boolean deregister; private static String dateformat; private static SimpleDateFormat dateformatter; private static String includecategories; private static String excludecategories; private static String stringmatcher; private static StringMatcher stringMatcherEngine; private static String sqlExpression; private static boolean stackTrace; private static String stackTraceClass; private static boolean reloadProperties; private static long reloadPropertiesInterval; private static long reloadMs; private static String jndicontextfactory; private static String jndicontextproviderurl; private static String jndicontextcustom; private static String realdatasource; private static String realdatasourceclass; private static String realdatasourceproperties; private static long executionThreshold; }
自此属性文件配置线路完毕。
相关推荐
压缩包中的"p6spy-syj"可能是一个包含了精简版p6spy的源码和说明文档的文件。源码可以用于学习和二次开发,说明文档则能指导用户如何正确安装和使用这个工具。对于非开发人员,理解文档中的步骤和配置说明至关重要,...
p6spy-spring-boot-starter p6spy弹簧启动器说明基于p6spy的Spring Boot Starter实现玛文< dependency>< groupId>com.github.hiwepy</ groupId>< artifactId>p6spy-spring-boot-starter</ artifactId>< version>${...
**P6Spy 知识点详解** P6Spy 是一个开源的 Java 库,它专为监控和分析数据库应用的 SQL 活动...本版本的 "p6spy-maven工程源码" 提供了一个可以直接导入并运行的 Maven 项目,方便开发者快速体验和利用 P6Spy 的功能。
具体来说,可以从SourceForge网站上找到P6Spy的官方下载页面,下载对应版本的源码压缩包p6spy-src.zip。下载完成后,将该压缩包解压,然后将解压得到的源码文件导入到MyEclipse的源码项目中。在导入源码之后,用户就...
1. **下载P6Spy**:首先,你需要从官方或者其他可信来源下载P6Spy的JAR文件,如提供的`p6spy.jar`。 2. **添加依赖**:将下载的`p6spy.jar`添加到项目的类路径中,确保在运行时能够被应用到。 3. **配置数据库驱动**...
1. **添加依赖**:首先,你需要将P6Spy的JAR文件(如`p6spy-2.1.0.jar`)添加到项目的类路径中。如果是Maven项目,可以在`pom.xml`中添加对应的依赖条目。 2. **配置代理驱动**:在`jdbc.properties`或类似配置文件...
P6Spy生成的日志文件可以使用文本编辑器查看,也可以使用专门的分析工具。通过分析日志,我们可以: 1. **找出执行慢的SQL**:根据执行时间排序,找出耗时较长的SQL语句。 2. **查询优化**:对执行慢的SQL进行优化...
5. **配置集成**:P6Spy的配置通常在`spy.properties`文件中进行,包括日志格式、监控规则等。我们需要为自定义监控器创建类似的配置机制,以便用户可以根据需要调整监控行为。 6. **异常处理**:当SQL执行失败时,...
P6Spy的配置主要通过`spy.properties`文件完成,该文件应放置在类路径的根目录下。以下是一些常见的配置选项: ```properties appender=com.p6spy.engine.logging.appender.StdoutAppender formatter=...
1. **配置P6Spy**:首先,需要在项目的类路径下添加P6Spy的jar文件,并在数据库连接URL中使用P6Spy的代理驱动,例如对于MySQL,URL可能类似于`jdbc:p6spy:mysql://localhost:3306/mydb`。 2. **配置日志**:在`spy....
3. **配置Spy.properties**:这是P6Spy的主要配置文件,需要设置包括日志文件路径、日志格式、要拦截的数据库连接字符串等信息。 4. **启动监控**:应用启动后,P6Spy 开始监听并记录所有数据库操作。 ### 三、配置...
用于分布式跟踪的库(如果在classpath中找到)可启用jdbc连接和查询跟踪(仅适用于p6spy或datasource-proxy) 为什么不将DataSource包装在配置中? 除了使用库之外,您还可以手动包装DataSource ,但是该库还提供了...
P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的。 p6spy的安装步骤: 1. 下载p6spy的安装包 2. 把p6spy的jar包放到Classpath中,如果是WEB App...
`p6spy-install.zip`包含了一些额外的安装和配置指南,可能包括了如何在不同的数据库驱动中配置P6Spy的说明。`README.txt`、`APACHE.txt`和`LICENSE.txt`文件则分别提供了软件的使用说明、Apache许可协议和版权信息...
3. `p6spy-src.rar`:这是一个包含P6Spy源代码的压缩文件,用户可以解压后在Eclipse中打开,进行查看或修改源代码。 总的来说,这个修改版的P6Spy是一个适用于特定需求的数据库监控解决方案,它保留了基本的SQL语句...
通过调整 P6Spy 的配置文件(通常是 `spy.properties`),可以设置规则来排除 ResultSet 的输出。例如,你可以设置一个过滤器,只记录 SQL 执行的开始和结束,而不包括结果集的详细信息。 【去掉问号】 在 SQL ...
综上所述,Card.Spy-darwin-x64是一种可能跨平台的恶意软件,利用ZIP文件进行传播,主要针对信用卡信息。了解这些知识点可以帮助用户提高对网络威胁的识别能力,从而采取必要的预防措施来保护自己的系统和数据安全。
P6Spy产生的日志文件包含了详细的SQL执行信息,包括执行时间、参数等,这对于性能分析和优化非常有帮助。日志格式通常包括模块信息、时间戳、SQL语句以及执行时长等,可以通过调整配置参数来控制日志的详细程度和...
通过P6Spy,我们可以得到诸如SQL语句的原始格式、执行时间、异常信息等详细信息,这对于分析和优化数据库性能至关重要。例如,你可以找出导致高延迟的SQL语句,或者检查是否有未优化的查询。此外,P6Spy还支持自定义...
4. 根据需要,可能还需要配置P6Spy识别实际数据库驱动的方式,这通常通过`driverlist`属性完成。 同时,将SQL Profiler和P6Spy结合使用,可以提供更全面的数据库性能监控视图。在Java应用中,P6Spy可以捕获和记录...