p6spy mysql8_P6Spy监控SQL语句及性能测试
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语句及性能测试相关推荐
- 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。
快速阅读 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控. 我们知道sql server 中有个工具叫sql profile ,可以实时监控sql server中 执行的sql 语句,以 ...
- 应用Druid监控SQL语句的执行情况--转载
Druid是什么? Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...
- 应用Druid监控SQL语句的执行情况
Druid是什么? Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...
- Hibernate 配置 p6spy 显示完整 sql 语句
一.下载 p6spy-install包 官网:[url]http://www.p6spy.com/[/url] 拷贝 p6spy.jar 到 WEB-INF\lib\ spy.pr ...
- 如何使用p6spy来监控sql
本文来记录下p6spy的使用 文章目录 概述 概述
- Druid配置好之后sql监控界面不显示sql语句的可能原因
完全按照druid的github上面的文档配置好druid之后,sql监控界面不显示sql语句,监控sql语句的filter也是配置了的 # 配置StatFilter,监控sql语句需要这一项 spr ...
- java 日志打印sql语句_利用log4j打印sql的log日志
默认情况下,使用ibatis是不打印ibatis相关的log的,因为内部的sql执行都是内部调用,在server的控制台是不 会 打印log的. 在log4j的配置文件log4j.properties ...
- oracle语句转成mysql语句_如何监控Mysql语句
快速阅读 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控. 我们知道sql server 中有个工具叫sql profile ,可以实时监控sql server中 执行的sql 语句,以 ...
- mybatis-plus配置控制台打印完整带参数SQL语句
问题背景 通常我们开发的时候,需要联合控制台和Navicat/PLSQL等工具进行语句的拼接检查,如果只是输出了一堆???,那么将极大降低我们的效率.因此我们需要输出完整的SQL语句以便调试. Upd ...
- sql oracle复制一张表里,Oracle如何复制表的sql语句
以下的文章主要是介绍Oracle复制表的sql语句,其中包括如何复制表结构的sql.以及如何复制相关表的结构又复制表中的数据sql.以下就是相关内容的具体介绍,望你浏览完以下的内容会有所收获. 如下, ...
最新文章
- 编译pqxx源码configure时遇到codecs.py LookupError的解决方法
- struts2 如何跳转html5,在线HTML编辑器——ueditor,跟struts2结合
- javascript中清空数组的两种方式
- STM32开发 -- md5sum命令
- JFlow CCFlow工作流引擎北京培训邀请函
- 源码级别的广播与监听实现
- mac抹掉磁盘重装系统未能与服务器取得联系_【工具】mac笔记本rm -rf 后 如何恢复删除的文件...
- android 静态链接,android通过C代码实现动态和静态链接
- Matlab调用excel数据绘制折线图
- MySQL数据库备份与还原
- vue集成汉字转拼音并提取首字母
- 解析rosbag数据并使用websocket发送到客户端
- EXCEL多页打印时,上边框线无法显示
- 序列标注NER、POS、Chunking、SRL
- 回答朋友关于微信CRM系统如何使用的问题
- 苹果手机升级13无法开机_苹果手机升级之后开不了机怎么办?
- [附源码]Java计算机毕业设计SSM办公用品管理系统
- Python爬虫——爬取股票信息
- JAVA:实现AES 加密算法(附完整源码)
- 怎么在vscode上面使用git仓库管理工具