http://p6spy.github.io/p6spy/2.0/configandusage.html

P6Spy下载:http://sourceforge.net/projects/p6spy/files/

P6Spy介绍:http://www.open-open.com/lib/view/open1429863625385.html

配置sqlP6Spy配置信息说明:http://blog.csdn.net/z69183787/article/details/43453581

P6Spy和sping配合显示真正的SQL:http://blog.csdn.net/rznice/article/details/7044614

P6Spy源码分析,理解跟踪SQL的工作原理 :http://blog.csdn.net/sunyujia/article/details/2207027

测试实例:

package p6spy;

import java.beans.PropertyVetoException;

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Properties;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import com.p6spy.engine.spy.P6DataSource;

public class testP6Spy {

private static Logger log = LoggerFactory.getLogger(testP6Spy.class);

private static P6DataSource p6DSource =null;

private static ComboPooledDataSource cpDSource =null;

private static void initP6SpyDataSource(){

Properties props = new Properties();

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("c3p0.properties");

try {

props.load(in);

} catch (IOException e) {

e.printStackTrace();

}

finally{

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

cpDSource = new ComboPooledDataSource();

try {

cpDSource.setDriverClass(props.getProperty("driver"));

log.info("=============driver:"+props.getProperty("driver"));

cpDSource.setJdbcUrl(props.getProperty("url"));

log.info("=============url:"+props.getProperty("url"));

cpDSource.setUser(props.getProperty("user"));

log.info("=============user:"+props.getProperty("user"));

cpDSource.setPassword(props.getProperty("password"));

log.info("=============password:"+props.getProperty("password"));

cpDSource.setInitialPoolSize(5);

cpDSource.setMinPoolSize(30);

cpDSource.setMinPoolSize(5);

/*c3p0全局的PreparedStatements缓存的大小。

如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,

只要有一个不为0,则语句的缓存就能生效。如果默认值: 0*/

cpDSource.setMaxStatements(100);

//最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0

cpDSource.setIdleConnectionTestPeriod(60);

/*如果为false,则获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,

但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。

如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认: false*/

cpDSource.setBreakAfterAcquireFailure(false);

//定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次

cpDSource.setAcquireRetryAttempts(30);

cpDSource.setTestConnectionOnCheckout(false);

} catch (PropertyVetoException e) {

e.printStackTrace();

}

p6DSource = new P6DataSource(cpDSource);

log.info("========Init p6DSource end=============");

}

public static void main(String[] args){

initP6SpyDataSource();

testP6SpyBaseMysql();

}

public static void testP6SpyBaseMysql()

{

Connection con = null;// 创建一个数据库连接

PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement

ResultSet result = null;// 创建一个结果集对象

try

{

con = p6DSource.getConnection();

String iSql = "INSERT INTO user(name,age)VALUES(?,?)";

PreparedStatement ps =con.prepareStatement(iSql);

ps.setString(1, "jack");

ps.setInt(2, 23);

ps.execute();

ps.setString(1, "mark");

ps.setInt(2, 67);

ps.execute();

String uSql = "UPDATE user SET name = ?,age=? WHERE id=?";

ps = con.prepareStatement(uSql);

ps.setString(1, "donald");

ps.setInt(2, 28);

ps.setInt(3, 11);

ps.executeUpdate();

}

catch (Exception e)

{

log.error("============ERROR:"+e.getMessage());

e.printStackTrace();

}

finally

{

try

{

if (result != null)

result.close();

if (pre != null)

pre.close();

if (con != null)

con.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

}

}

测试结果:

八月 23, 2016 6:42:43 下午 com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger log

信息: MLog clients using slf4j logging.

八月 23, 2016 6:42:44 下午 com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger log

信息: Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]

八月 23, 2016 6:42:44 下午 p6spy.testP6Spy initP6SpyDataSource

信息: =============driver:com.mysql.jdbc.Driver

八月 23, 2016 6:42:44 下午 p6spy.testP6Spy initP6SpyDataSource

信息: =============url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8

八月 23, 2016 6:42:44 下午 p6spy.testP6Spy initP6SpyDataSource

信息: =============user:donald

八月 23, 2016 6:42:44 下午 p6spy.testP6Spy initP6SpyDataSource

信息: =============password:123456

八月 23, 2016 6:42:44 下午 p6spy.testP6Spy initP6SpyDataSource

信息: ========Init p6DSource end=============

八月 23, 2016 6:42:44 下午 com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger log

信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 2sigdn9i1ervxzto1pef0|64cd046, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 2sigdn9i1ervxzto1pef0|64cd046, idleConnectionTestPeriod -> 60, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 100, maxStatementsPerConnection -> 0, minPoolSize -> 5, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]

p6spy - 2016-08-23 18:42:44 -0    [p6spy] INFO    - 06:42:44,822|100|1|statement|INSERT INTO user(name,age)VALUES(?,?)|INSERT INTO user(name,age)VALUES('jack',23)

p6spy - 2016-08-23 18:42:44 -3    [p6spy] INFO    - 06:42:44,826|104|2|statement|INSERT INTO user(name,age)VALUES(?,?)|INSERT INTO user(name,age)VALUES('jack',23)

p6spy - 2016-08-23 18:42:44 -22   [p6spy] INFO    - 06:42:44,845|19|1|statement|INSERT INTO user(name,age)VALUES(?,?)|INSERT INTO user(name,age)VALUES('mark',67)

p6spy - 2016-08-23 18:42:44 -22   [p6spy] INFO    - 06:42:44,845|19|2|statement|INSERT INTO user(name,age)VALUES(?,?)|INSERT INTO user(name,age)VALUES('mark',67)

p6spy - 2016-08-23 18:42:44 -23   [p6spy] INFO    - 06:42:44,846|0|1|statement|UPDATE user SET name = ?,age=? WHERE id=?|UPDATE user SET name = 'donald',age=28 WHERE id=11

p6spy - 2016-08-23 18:42:44 -23   [p6spy] INFO    - 06:42:44,846|0|2|statement|UPDATE user SET name = ?,age=? WHERE id=?|UPDATE user SET name = 'donald',age=28 WHERE id=11

c3p0.properties文件配置:

driver=com.mysql.jdbc.Driver

url=jdbc\:mysql\://localhost\:3306/test?useUnicode\=true&characterEncoding\=utf8&characterSetResults\=utf8

user=donald

password=123456

minPoolSize=10

maxPoolSize=100

maxIdleTime=1800

acquireIncrement=3

maxStatements=1000

initialPoolSize=10

idleConnectionTestPeriod=60

acquireRetryAttempts=30

breakAfterAcquireFailure=true

testConnectionOnCheckout=false

spy.properties主要配置:

module.log=com.p6spy.engine.logging.P6LogFactory

realdriver=com.mysql.jdbc.Driver

deregisterdrivers=true

dateformat=hh:mm:ss,SSS

appender=com.p6spy.engine.logging.appender.Log4jLogger

#appender=com.p6spy.engine.logging.appender.StdoutLogger

#appender=com.p6spy.engine.logging.appender.FileLogger

# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) (used for file logger only)

#logfile     = spy.log

# append to  the p6spy log file.  if this is set to false the

# log file is truncated every time.  (file logger only)

append=true

#The following are for log4j logging only

log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender

log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout

log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %d{yyyy-MM-dd HH\:mm\:ss} -%-4r [%c] %-5p  %x - %m%n

log4j.appender.ROLLFILE=org.apache.log4j.DailyRollingFileAppender

log4j.appender.ROLLFILE.File=F:/spy-logs/

log4j.appender.ROLLFILE.DatePattern=yyyy-MM-dd'.log'

log4j.appender.ROLLFILE.layout=org.apache.log4j.PatternLayout

log4j.appender.ROLLFILE.layout.ConversionPattern=p6spy - %d{yyyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L \: %m%n

#log4j.appender.CHAINSAW_CLIENT=org.apache.log4j.net.SocketAppender

#log4j.appender.CHAINSAW_CLIENT.RemoteHost=localhost

#log4j.appender.CHAINSAW_CLIENT.Port=4445

#log4j.appender.CHAINSAW_CLIENT.LocationInfo=true

log4j.logger.p6spy=INFO,STDOUT,ROLLFILE

log4j.properties配置:

log4j.rootLogger=INFO,CONSOLE,FILE

log4j.addivity.org.apache=false

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.Threshold=DEBUG

log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} -%-4r [%c] %-5p  %x - %m%n

log4j.appender.CONSOLE.Target=System.out

log4j.appender.CONSOLE.Encoding=gbk

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender

log4j.appender.FILE.File=F:/logs/

log4j.appender.FILE.DatePattern=yyyy-MM-dd'.log'

log4j.appender.FILE.layout=org.apache.log4j.PatternLayout

log4j.appender.FILE.layout.ConversionPattern=[FH_sys]  %d{yyyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L \: %m%n

问题结局:

1.driver com.mysql.jdbc.Driver is a real driver in spy.properties,

but it has been loaded before p6spy.  p6spy will not wrap these connections.

Either prevent the driver from loading, or try setting 'deregisterdrivers' to true in spy.properties

方法:

#防止realdriver在p6spy驱动之前加载

deregisterdrivers=true

2.Connections could not be acquired from the underlying database

这个问题由于数据源配置问题

方法:

1,驱动配置有误:driver=com.mysql.jdbc.Driver

2,数据库连接地址有误:url=jdbc:mysql://localhost:3306/test?3useUnicode=true&characterEncoding=utf8

3,密码或帐号有误:username=donald password=123456

4,数据库未启动或无权访问

5,项目未引入对应的驱动jar包mysql-connector-java-5.1.8.jar

6,mysql root没有远程访问的权限,需要增加权限,增加权限的步骤如下:

进入mysql数据库:

grant all privileges on *.* to 'donald'@'%' identified by '123456';

flush privileges;

如果上面没有解决,看看c3p0.properties属性配置是不是有错

属性后面不要有空格

大小: 18.9 KB

分享到:

2016-08-23 18:57

浏览 2947

评论

p6spy mysql8_P6Spy监控SQL语句及性能测试相关推荐

  1. 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。

    快速阅读 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控. 我们知道sql server 中有个工具叫sql profile ,可以实时监控sql server中 执行的sql 语句,以 ...

  2. 应用Druid监控SQL语句的执行情况--转载

    Druid是什么? Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...

  3. 应用Druid监控SQL语句的执行情况

    Druid是什么? Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...

  4. Hibernate 配置 p6spy 显示完整 sql 语句

    一.下载 p6spy-install包   官网:[url]http://www.p6spy.com/[/url] 拷贝 p6spy.jar 到 WEB-INF\lib\         spy.pr ...

  5. 如何使用p6spy来监控sql

    本文来记录下p6spy的使用 文章目录 概述 概述

  6. Druid配置好之后sql监控界面不显示sql语句的可能原因

    完全按照druid的github上面的文档配置好druid之后,sql监控界面不显示sql语句,监控sql语句的filter也是配置了的 # 配置StatFilter,监控sql语句需要这一项 spr ...

  7. java 日志打印sql语句_利用log4j打印sql的log日志

    默认情况下,使用ibatis是不打印ibatis相关的log的,因为内部的sql执行都是内部调用,在server的控制台是不 会 打印log的. 在log4j的配置文件log4j.properties ...

  8. oracle语句转成mysql语句_如何监控Mysql语句

    快速阅读 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控. 我们知道sql server 中有个工具叫sql profile ,可以实时监控sql server中 执行的sql 语句,以 ...

  9. mybatis-plus配置控制台打印完整带参数SQL语句

    问题背景 通常我们开发的时候,需要联合控制台和Navicat/PLSQL等工具进行语句的拼接检查,如果只是输出了一堆???,那么将极大降低我们的效率.因此我们需要输出完整的SQL语句以便调试. Upd ...

  10. sql oracle复制一张表里,Oracle如何复制表的sql语句

    以下的文章主要是介绍Oracle复制表的sql语句,其中包括如何复制表结构的sql.以及如何复制相关表的结构又复制表中的数据sql.以下就是相关内容的具体介绍,望你浏览完以下的内容会有所收获. 如下, ...

最新文章

  1. 编译pqxx源码configure时遇到codecs.py LookupError的解决方法
  2. struts2 如何跳转html5,在线HTML编辑器——ueditor,跟struts2结合
  3. javascript中清空数组的两种方式
  4. STM32开发 -- md5sum命令
  5. JFlow CCFlow工作流引擎北京培训邀请函
  6. 源码级别的广播与监听实现
  7. mac抹掉磁盘重装系统未能与服务器取得联系_【工具】mac笔记本rm -rf 后 如何恢复删除的文件...
  8. android 静态链接,android通过C代码实现动态和静态链接
  9. Matlab调用excel数据绘制折线图
  10. MySQL数据库备份与还原
  11. vue集成汉字转拼音并提取首字母
  12. 解析rosbag数据并使用websocket发送到客户端
  13. EXCEL多页打印时,上边框线无法显示
  14. 序列标注NER、POS、Chunking、SRL
  15. 回答朋友关于微信CRM系统如何使用的问题
  16. 苹果手机升级13无法开机_苹果手机升级之后开不了机怎么办?
  17. [附源码]Java计算机毕业设计SSM办公用品管理系统
  18. Python爬虫——爬取股票信息
  19. JAVA:实现AES 加密算法(附完整源码)
  20. 怎么在vscode上面使用git仓库管理工具

热门文章

  1. 常见视频格式有哪些?
  2. Element plus设置日历每周第一天从周一开始
  3. python主函数调用子函数,实现excel数据写入
  4. Ubuntu中的截图工具
  5. int与byte之间的相互转化
  6. 设置VS201X release模式下可单步调试
  7. 分享一个USB转杜邦线 5V取电的3D打印件,附3D打印文件
  8. iPadOS、iOS13降级iOS12.3.1方法
  9. Qt信号槽机制与优势与不足
  10. java初级程序员学习思路