- 浏览: 996404 次
-
文章分类
- 全部博客 (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源码分析-属性文件加载:http://donald-draper.iteye.com/admin/blogs/2319851
P6Spy源码分析-Connection获取,日志打印:http://donald-draper.iteye.com/admin/blogs/2319873
使用P6Spy的时候用到这一句我们来看这一句的内涵:
P6DataSource p6DSource = new P6DataSource(cpDSource)
超时日志线路解析:
P6DataSource,的getConnection方法通过 P6SpyDriverCore.wrapConnection(rds.getConnection())获取连接;
再来看看P6SpyDriverCore的wrapConnection的方法都做了什么事情
这一句很重要:con = factory.getConnection(con),这个factory实际上是P6LogFactory或P6OutageFactory
再来看看P6OutageFactory的getConnection()的方法
再看P6OutageConnection
再看P6Connection
再看P6OutagePreparedStatement
再看P6OutageOptions
再看P6OutageDetector(statement超时探测器)
P6LogQuery类,这里就不分析了,在前面已经说过了
总结:
通过以上的分析,相信大家对P6Spy超时探测,connection获取,日志打印有了
初步的了解,主要 点,static语句块,初始化类,利用工场模式获取connection,
单例模式获取探测器,日志的打印主要通过封装实现jdbc的statement来嵌入。
P6Spy源码分析-属性文件加载:http://donald-draper.iteye.com/admin/blogs/2319851
P6Spy源码分析-Connection获取,日志打印:http://donald-draper.iteye.com/admin/blogs/2319873
使用P6Spy的时候用到这一句我们来看这一句的内涵:
P6DataSource p6DSource = new P6DataSource(cpDSource)
// 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,的getConnection方法通过 P6SpyDriverCore.wrapConnection(rds.getConnection())获取连接;
再来看看P6SpyDriverCore的wrapConnection的方法都做了什么事情
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; } protected Driver passthru; protected static boolean initialized = false; protected static ArrayList factories; protected static ArrayList realDrivers = new ArrayList(); protected static boolean foundSpyProperties; }
这一句很重要:con = factory.getConnection(con),这个factory实际上是P6LogFactory或P6OutageFactory
再来看看P6OutageFactory的getConnection()的方法
public class P6OutageFactory extends P6CoreFactory { //返回P6OutageConnection public Connection getConnection(Connection conn) throws SQLException { return new P6OutageConnection(this, conn); } //返回P6OutagePreparedStatement public PreparedStatement getPreparedStatement(PreparedStatement real, P6Connection conn, String p0) throws SQLException { return new P6OutagePreparedStatement(this, real, conn, p0); } }
再看P6OutageConnection
public class P6OutageConnection extends P6Connection implements Connection { //提交 public void commit() throws SQLException { long startTime = System.currentTimeMillis(); //outagedetection=true if(P6OutageOptions.getOutageDetection()) //P6OutageDetector,注册statement行为commit事件 P6OutageDetector.getInstance().registerInvocation(this, startTime, "commit", "", ""); try { passthru.commit(); } finally { if(P6OutageOptions.getOutageDetection()) P6OutageDetector.getInstance().unregisterInvocation(this); } } }
再看P6Connection
public class P6Connection extends P6Base implements Connection { 获取预编译Statement,看到这是不是很熟悉的JDBC的Connection.prepareStatement(String sql) public PreparedStatement prepareStatement(String p0) throws SQLException { 这里条用的实际就是P6OutageFactory的getPreparedStatement的方法,返回P6OutagePreparedStatement return getP6Factory().getPreparedStatement(passthru.prepareStatement(p0), this, p0); } }
再看P6OutagePreparedStatement
public class P6OutagePreparedStatement extends P6PreparedStatement implements PreparedStatement { public boolean execute() throws SQLException { long startTime = System.currentTimeMillis(); //outagedetection=true if(P6OutageOptions.getOutageDetection()) //将statement注册到P6OutageDetector(statement超时探测器) P6OutageDetector.getInstance().registerInvocation(this, startTime, "statement", preparedQuery, getQueryFromPreparedStatement()); boolean flag; try { flag = prepStmtPassthru.execute(); } finally { //outagedetection=true if(P6OutageOptions.getOutageDetection()) //当statement执行完毕,将statement从P6OutageDetector(statement超时探测器)移除 P6OutageDetector.getInstance().unregisterInvocation(this); } return flag; } }
再看P6OutageOptions
//超时属性配置 //outagedetection=true //outagedetectioninterval=5 public class P6OutageOptions extends P6Options { public static boolean getOutageDetection() { return outageDetection; } public static void setOutageDetection(String _outagedetection) { outageDetection = P6Util.isTrue(_outagedetection, false); } public static long getOutageDetectionInterval() { return outageDetectionInterval; } public static long getOutageDetectionIntervalMS() { return outageMs; } public static void setOutageDetectionInterval(String _outagedetectioninterval) { outageDetectionInterval = P6Util.parseLong(_outagedetectioninterval, -1L); outageMs = outageDetectionInterval * 1000L; } protected static boolean outageDetection; protected static long outageDetectionInterval; protected static long outageMs; }
再看P6OutageDetector(statement超时探测器)
//实际上是一个线程 public class P6OutageDetector implements Runnable { protected P6OutageDetector() { pendingMessages = null; haltThread = false; pendingMessages = new Hashtable(); P6LogQuery.logDebug("P6Spy - P6OutageDetector has been invoked."); P6LogQuery.logDebug("P6Spy - P6OutageOptions.getOutageDetectionIntervalMS() = " + P6OutageOptions.getOutageDetectionIntervalMS()); } //单例模式获取探测器实例 public static synchronized P6OutageDetector getInstance() { if(instance == null) { instance = new P6OutageDetector(); ThreadGroup group = new ThreadGroup("P6SpyThreadGroup"); //放在后再运行 group.setDaemon(true); Thread outageThread = new Thread(group, instance, "P6SpyOutageThread"); outageThread.start(); } return instance; } public void run() { while(!haltThread) { detectOutage(); try { //睡眠outagedetectioninterval=5秒 Thread.sleep(P6OutageOptions.getOutageDetectionIntervalMS()); } catch(Exception e) { } } } public void shutdown() { haltThread = true; } //将statement注册到探测器 public void registerInvocation(Object jdbcObject, long startTime, String category, String ps, String sql) { //pendingMessages其实是一个HashMap,private Hashtable pendingMessages; pendingMessages.put(jdbcObject, new InvocationInfo(startTime, category, ps, sql)); } //将statement从探测器移除 public void unregisterInvocation(Object jdbcObject) { pendingMessages.remove(jdbcObject); } //探测是否有超时的statement private void detectOutage() { int listSize = pendingMessages.size(); if(listSize == 0) return; P6LogQuery.logDebug("P6Spy - detectOutage.pendingMessage.size = " + listSize); long currentTime = System.currentTimeMillis(); long threshold = P6OutageOptions.getOutageDetectionIntervalMS(); Set keys = pendingMessages.keySet(); for(Iterator keyIter = keys.iterator(); keyIter.hasNext();) { InvocationInfo ii = (InvocationInfo)pendingMessages.get(keyIter.next()); //判断statement是否超时 if(ii != null && currentTime - ii.startTime > threshold) { //打印日志 P6LogQuery.logDebug("P6Spy - statement exceeded threshold - check log."); logOutage(ii); } } } //打印日志 private void logOutage(InvocationInfo ii) { P6LogQuery.logElapsed(-1, ii.startTime, "OUTAGE", ii.preparedStmt, ii.sql); } private Hashtable pendingMessages; private boolean haltThread; private static P6OutageDetector instance = null; private static final boolean debug = true; }
P6LogQuery类,这里就不分析了,在前面已经说过了
总结:
通过以上的分析,相信大家对P6Spy超时探测,connection获取,日志打印有了
初步的了解,主要 点,static语句块,初始化类,利用工场模式获取connection,
单例模式获取探测器,日志的打印主要通过封装实现jdbc的statement来嵌入。
相关推荐
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
wrf转mp4播放器1.1.1
内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。
国网台区终端最新规范
《基于YOLOv8的智慧农业水肥一体化控制系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
GSDML-V2.33-LEUZE-AMS3048i-20170622.xml
微信小程序项目课程设计,包含LW+ppt
微信小程序项目课程设计,包含LW+ppt
终端运行进度条脚本
幼儿园预防肺结核教育培训课件资料
python,python相关资源
《基于YOLOv8的智慧校园电动车充电桩状态监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
deepseek 临床之理性软肋.pdf
SM2258XT量产工具(包含16种程序),固态硬盘量产工具使用
RecyclerView.zip
水务大脑让水务运营更智能(23页)
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
大众捷达轿车前轮制动器设计
《基于YOLOv8的智能工厂压缩空气泄漏检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
3米-翻抛机