2019独角兽企业重金招聘Python工程师标准>>>
开发体验
其实当我们使用一种语言,一个框架的时候,这时的我作为用户,语言的冗余语法,框架的复杂配置,都会让我们开发体验变糟
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代理吧,它还有以下的特色功能
- 记录长sql,这点即使上线也可以用得到,再spy.properties的# outagedetection=true|false# outagedetectioninterval=integer time (seconds)中
- 灵活的sql过滤,可以使用filter include include sqlexpression来过滤
- 可以和slf4j集成,这样可以使用通用的日志系统来记录日志
开始集成P6SPY,maven中
- 添加依赖
- 设置spy.properties
- 配置KiKariCP
- 配置log4j2
- 新建测试数据表
- 获取sqlManager
- 执行,看到结果
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**