`
Donald_Draper
  • 浏览: 980883 次
社区版块
存档分类
最新评论

P6Spy源码分析-属性文件加载

阅读更多
P6Spy使用:http://donald-draper.iteye.com/blog/2319646
使用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精简版-跟踪sql工具

    压缩包中的"p6spy-syj"可能是一个包含了精简版p6spy的源码和说明文档的文件。源码可以用于学习和二次开发,说明文档则能指导用户如何正确安装和使用这个工具。对于非开发人员,理解文档中的步骤和配置说明至关重要,...

    p6spy-spring-boot-starter:弹簧启动启动器p6spy

    p6spy-spring-boot-starter p6spy弹簧启动器说明基于p6spy的Spring Boot Starter实现玛文< dependency>< groupId>com.github.hiwepy</ groupId>< artifactId>p6spy-spring-boot-starter</ artifactId>< version>${...

    p6spy的maven工程源码

    **P6Spy 知识点详解** P6Spy 是一个开源的 Java 库,它专为监控和分析数据库应用的 SQL 活动...本版本的 "p6spy-maven工程源码" 提供了一个可以直接导入并运行的 Maven 项目,方便开发者快速体验和利用 P6Spy 的功能。

    myeclipse配置p6spy以及导入源码

    具体来说,可以从SourceForge网站上找到P6Spy的官方下载页面,下载对应版本的源码压缩包p6spy-src.zip。下载完成后,将该压缩包解压,然后将解压得到的源码文件导入到MyEclipse的源码项目中。在导入源码之后,用户就...

    下载 p6spy.jar (内含使用步骤)

    1. **下载P6Spy**:首先,你需要从官方或者其他可信来源下载P6Spy的JAR文件,如提供的`p6spy.jar`。 2. **添加依赖**:将下载的`p6spy.jar`添加到项目的类路径中,确保在运行时能够被应用到。 3. **配置数据库驱动**...

    数据插入监控 p6spy

    1. **添加依赖**:首先,你需要将P6Spy的JAR文件(如`p6spy-2.1.0.jar`)添加到项目的类路径中。如果是Maven项目,可以在`pom.xml`中添加对应的依赖条目。 2. **配置代理驱动**:在`jdbc.properties`或类似配置文件...

    p6spy-sql监控

    P6Spy生成的日志文件可以使用文本编辑器查看,也可以使用专门的分析工具。通过分析日志,我们可以: 1. **找出执行慢的SQL**:根据执行时间排序,找出耗时较长的SQL语句。 2. **查询优化**:对执行慢的SQL进行优化...

    借鉴p6spy,实现自己的SQL执行监控器项目源代码

    5. **配置集成**:P6Spy的配置通常在`spy.properties`文件中进行,包括日志格式、监控规则等。我们需要为自定义监控器创建类似的配置机制,以便用户可以根据需要调整监控行为。 6. **异常处理**:当SQL执行失败时,...

    p6spy 在weblogic中的配置 以及使用sqlprofiler监控

    P6Spy的配置主要通过`spy.properties`文件完成,该文件应放置在类路径的根目录下。以下是一些常见的配置选项: ```properties appender=com.p6spy.engine.logging.appender.StdoutAppender formatter=...

    p6spy简介显示hibernate配置

    1. **配置P6Spy**:首先,需要在项目的类路径下添加P6Spy的jar文件,并在数据库连接URL中使用P6Spy的代理驱动,例如对于MySQL,URL可能类似于`jdbc:p6spy:mysql://localhost:3306/mydb`。 2. **配置日志**:在`spy....

    p6spy-3.7.0.zip

    3. **配置Spy.properties**:这是P6Spy的主要配置文件,需要设置包括日志文件路径、日志格式、要拦截的数据库连接字符串等信息。 4. **启动监控**:应用启动后,P6Spy 开始监听并记录所有数据库操作。 ### 三、配置...

    spring-boot-data-source-decorator:与p6spy,datasource-proxy,flexy-pool和spring-cloud-sleuth集成的Spring Boot

    用于分布式跟踪的库(如果在classpath中找到)可启用jdbc连接和查询跟踪(仅适用于p6spy或datasource-proxy) 为什么不将DataSource包装在配置中? 除了使用库之外,您还可以手动包装DataSource ,但是该库还提供了...

    P6SPY JDBC拦截打印sql语句 非常好的调试工具

    P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的。 p6spy的安装步骤: 1. 下载p6spy的安装包 2. 把p6spy的jar包放到Classpath中,如果是WEB App...

    p6spy_sqlprofiler-0.3-bin.zip

    `p6spy-install.zip`包含了一些额外的安装和配置指南,可能包括了如何在不同的数据库驱动中配置P6Spy的说明。`README.txt`、`APACHE.txt`和`LICENSE.txt`文件则分别提供了软件的使用说明、Apache许可协议和版权信息...

    p6spy 修改版,去掉resultset

    3. `p6spy-src.rar`:这是一个包含P6Spy源代码的压缩文件,用户可以解压后在Eclipse中打开,进行查看或修改源代码。 总的来说,这个修改版的P6Spy是一个适用于特定需求的数据库监控解决方案,它保留了基本的SQL语句...

    p6spy java 使用

    通过调整 P6Spy 的配置文件(通常是 `spy.properties`),可以设置规则来排除 ResultSet 的输出。例如,你可以设置一个过滤器,只记录 SQL 执行的开始和结束,而不包括结果集的详细信息。 【去掉问号】 在 SQL ...

    Card.Spy-darwin-x64_zip_

    综上所述,Card.Spy-darwin-x64是一种可能跨平台的恶意软件,利用ZIP文件进行传播,主要针对信用卡信息。了解这些知识点可以帮助用户提高对网络威胁的识别能力,从而采取必要的预防措施来保护自己的系统和数据安全。

    p6spy使用说明.doc

    P6Spy产生的日志文件包含了详细的SQL执行信息,包括执行时间、参数等,这对于性能分析和优化非常有帮助。日志格式通常包括模块信息、时间戳、SQL语句以及执行时长等,可以通过调整配置参数来控制日志的详细程度和...

    采用p6spy完整显示hibernate的SQL语句

    通过P6Spy,我们可以得到诸如SQL语句的原始格式、执行时间、异常信息等详细信息,这对于分析和优化数据库性能至关重要。例如,你可以找出导致高延迟的SQL语句,或者检查是否有未优化的查询。此外,P6Spy还支持自定义...

    sqlprofiler+p6spy+配制

    4. 根据需要,可能还需要配置P6Spy识别实际数据库驱动的方式,这通常通过`driverlist`属性完成。 同时,将SQL Profiler和P6Spy结合使用,可以提供更全面的数据库性能监控视图。在Java应用中,P6Spy可以捕获和记录...

Global site tag (gtag.js) - Google Analytics