使用p6spy+beetlsql记录真实执行sql

原创
2017/05/09 16:24
阅读数 2.5K

开发体验

其实当我们使用一种语言,一个框架的时候,这时的我作为用户,语言的冗余语法,框架的复杂配置,都会让我们开发体验变糟

P6SPY亮点

完整记录sql,某连接池记录如下:

2017-05-05 23:25:38.680 [http-apr-8180-exec-6] DEBUG java.sql.Connection:47 - ==>  Preparing: INSERT INTO table (filed1, filed2, filed3, filed4) VALUES (?, ?, ?, ?)   
2017-05-05 23:25:38.686 [http-apr-8180-exec-6] DEBUG java.sql.PreparedStatement:47 - ==> Parameters: 1(Long), aa(String), bb(String), 4(Integer)  

如果我们要单独调试sql,则需要复制两条,而且还要自己手工赋值,而且我认为数据库连接池应该专注性能,而不是做这些监控之内的东西
p6spy记录如下:

2017-05-05 23:30:17,836 ma I # took 28ms | statement | connection 0|insert into public.user
(name,age,nick_name) VALUES (?,?,?)  
insert into public.user  
(name,age,nick_name) VALUES ('lijiatu',24,'david');  

下面两句可以直接cv,然后调试,开发时相当方便
本文下方有项目的gitosc地址

P6SPY集成非常简单,也有广泛的支持,包括JNDI

P6SPY的其它优点

它类似一个简单的jdbc connection代理吧,它还有以下的特色功能

  1. 记录长sql,这点即使上线也可以用得到,再spy.properties的# outagedetection=true|false# outagedetectioninterval=integer time (seconds)中
  2. 灵活的sql过滤,可以使用filter include include sqlexpression来过滤
  3. 可以和slf4j集成,这样可以使用通用的日志系统来记录日志

开始集成P6SPY,maven中

  1. 添加依赖
  2. 设置spy.properties
  3. 配置KiKariCP
  4. 配置log4j2
  5. 新建测试数据表
  6. 获取sqlManager
  7. 执行,看到结果

1.添加依赖

主要有p6spy,HikariCP,slf4j-api,beetlsql,log4j2,都在项目的pom文件中

2.设置spy.properties

spy.properties需要放在项目的classpath根目录下,我是放在resources目录下了,由于我用的是postgresql和log4j2,所以我的配置是

driverlist=org.postgresql.Driver  
appender=com.p6spy.engine.spy.appender.Slf4JLogger  

另外我没有用预设的logMessageFormat,而是自己实现了接口写了pers.apricot.MyStyle

logMessageFormat=pers.apricot.MyStyle

3.配置KiKariCP

HikariCP.props中,url配置时要注意,jdbc:后面加上p6spy,最终效果如下

jdbcUrl=jdbc:p6spy:postgresql:postgres  

注意jdbcUrl的配置和dataSourceClassName是二选一,再使用p6spy的时候,最好不要在写dataSourceClassName了,否则有可能出错,我以前两个都配还行,现在使用了p6spy就不行了
如果使用其它的数据源,也是这样的规则,jdbc:后面加上p6spy

4.配置log4j2

由于只是测试,我就配了console和随机文件两个appender

5.新建测试数据表

在项目的script下面有postgresql的脚本

6.获取sqlManager

beetlsql围绕sqlManager来操作,在这里获取ConnectionSource的时候可以使用这种方式

ConnectionSourceHelper.getSingle(dataSource)

7.执行,看到结果

只是一条简单的插入语句,最终结果如下

2017-05-06 15:38:07,342 ma I # took 108ms | statement | connection 0|insert into public.user
(name,age,nick_name) VALUES (?,?,?)
insert into public.user
(name,age,nick_name) VALUES ('lijiatu',24,'david');

项目在码云上,地址是**learn-p6spy**

p6spy作为一个轻jdbc代理,还是很有用处的,可以自己继续挖掘

展开阅读全文
打赏
1
11 收藏
分享
加载中
李嘉图博主

引用来自“@西元前的你”的评论

log4jdbc
而且p6spy的文档也比它好,那个东西的文档现在还在google code呢
2017/05/23 13:43
回复
举报
李嘉图博主

引用来自“@西元前的你”的评论

log4jdbc
这东西停止更新好几年了,后来fork它的,也都停止更新好几年了,而且易用性不如p6spy,而且p6spy一直更新着,都到3了
2017/05/23 13:38
回复
举报
log4jdbc
2017/05/23 12:59
回复
举报
更多评论
打赏
3 评论
11 收藏
1
分享
返回顶部
顶部