在Java Project项目中使用p6spy的作用

本文介绍如何利用p6spy工具在Java项目中调试Hibernate生成的SQL语句,包括详细步骤及配置方法,适用于Java Project及Java Web项目。

这次项目中的一个bug用p6spy的SQL跟踪功能给找了出来,觉得这玩意儿特定环境下还挺好用,特转发一份其使用方法:

来源:http://it.100xuexi.com/view/otdetail/20120727/fc1fe55e-7b06-4292-8e2f-1ab0fe8bcbf7.html

 

使用Hibernate提供的内置属性<Property name="show_sql">true</Property>只能输出类似于下面的SQL语句:

1.           Hibernate:  

2.          

3.           insert into student(name, sex, age, cardId, classroom_id, id) values (?, ?, ?, ?, ?, ?)

这样不利于程序的调试,为了可以显示?占位符所代表的具体数据,需要第三方Jar包,p6spy是一个该需求的开源实现。

一、在Java Project项目中使用p6spy:

  1. 到其官方网站下载其Jar包,http://www.p6spy.com/(貌似不能访问了)靠Google或Baidu搜索一下吧。
  2. 一般Download下来的是zip或jar文件包,将其解压缩,将里面的p6spy.jar放入构建路径里,将spy.properties文件放入src目 录下。
  3. 修改两个属性,第一个,realdriver=你使用具体数据库的驱动类(例如MySQL为:com.mysql.jdbc.Driver);第二个,logfile=指定log文件的位置(例如,c:/spy.log)。
  4. 修改Hibernate.cfg.xml配置文件中的 <property name="hibernate.connection.driver_class">com.p6spy.engine.spy.P6SpyDriver</property>

配置完毕后,执行HQL语句后,查看spy.log文件就可以看到?占位符的具体数据了:(前面部分是Hibernate的初始化信息,最下面显示的就是完整的SQL语句)

1.           1326730516837|-1||debug||com.p6spy.engine.common.P6SpyOptions reloading properties 

2.           1326730516842|-1||info||Using properties file: D:\WorkSpace\MyEclipse\9\hibernate\list mapping\bin\spy.properties 

3.           1326730516842|-1||info||No value in environment for: getStackTrace, using: false 

4.           1326730516842|-1||info||No value in environment for: getAppender, using: com.p6spy.engine.logging.appender.FileLogger 

5.           1326730516842|-1||info||No value in environment for: getDeregisterDrivers, using: false 

6.           1326730516842|-1||info||No value in environment for: getUsePrefix, using: false 

7.           1326730516842|-1||info||No value in environment for: getExecutionThreshold, using: 0 

8.           1326730516842|-1||info||No value in environment for: getAutoflush, using: true 

9.           1326730516842|-1||info||No value in environment for: getExclude, using:  

10.       1326730516842|-1||info||No value in environment for: getExcludecategories, using: info,debug,result,batch 

11.       1326730516843|-1||info||No value in environment for: getFilter, using: false 

12.       1326730516843|-1||info||No value in environment for: getInclude, using:  

13.       1326730516843|-1||info||No value in environment for: getIncludecategories, using:  

14.       1326730516843|-1||info||No value in environment for: getLogfile, using: spy.log 

15.       1326730516843|-1||info||No value in environment for: getRealdriver, using: com.mysql.jdbc.Driver 

16.       1326730516843|-1||info||No value in environment for: getRealdriver2, using:  

17.       1326730516843|-1||info||No value in environment for: getRealdriver3, using:  

18.       1326730516843|-1||info||No value in environment for: getAppend, using: true 

19.       1326730516843|-1||info||No value in environment for: getSpydriver, using: com.p6spy.engine.spy.P6SpyDriver 

20.       1326730516843|-1||info||No value in environment for: getDateformat, using:  

21.       1326730516843|-1||info||No value in environment for: getDateformatter, using: null 

22.       1326730516843|-1||info||No value in environment for: getStringmatcher, using: com.p6spy.engine.common.SubstringMatcher 

23.       1326730516843|-1||info||No value in environment for: getStringMatcherEngine, using: com.p6spy.engine.common.SubstringMatcher@60e128 

24.       1326730516843|-1||info||No value in environment for: getStackTraceClass, using:  

25.       1326730516843|-1||info||No value in environment for: getSQLExpression, using: null 

26.       1326730516843|-1||info||No value in environment for: getReloadProperties, using: false 

27.       1326730516843|-1||info||No value in environment for: getReloadPropertiesInterval, using: 60 

28.       1326730516843|-1||info||No value in environment for: getJNDIContextFactory, using: null 

29.       1326730516843|-1||info||No value in environment for: getJNDIContextProviderURL, using: null 

30.       1326730516844|-1||info||No value in environment for: getJNDIContextCustom, using: null 

31.       1326730516844|-1||info||No value in environment for: getRealDataSource, using: null 

32.       1326730516844|-1||info||No value in environment for: getRealDataSourceClass, using: null 

33.       1326730516844|-1||info||No value in environment for: getRealDataSourceProperties, using: null 

34.       1326730517419|7|0|statement|select max(id) from classroom|select max(id) from classroom 

35.       1326730517440|0|0|statement|select max(id) from student|select max(id) from student 

36.       1326730517454|0|0|statement|insert into classroom (grade, number, id) values (?, ?, ?)|insert into classroom (grade, number, id) values ('fourth grade', 1, 1) 

37.       1326730517456|1|0|statement|insert into student (name, sex, age, cardId, classroom_id, id) values (?, ?, ?, ?, ?, ?)|insert into student (name, sex, age, cardId, classroom_id, id) values ('lisi', 'true', 21, '08053120', 1, 2) 

38.       1326730517457|0|0|statement|update student set classroom_id=?, index_=? where id=?|update student set classroom_id=1, index_=1 where id=2

39.       1326730517458|0|0|commit||

二、在Java Web项目中使用p6spy(Tomcat环境下)

  1. 将p6spy.jar 放入应用程序的WEB-INF/lib目录,将spy.properties放入WEB-INF/classes目录
  2. 其他与Java Project项目使用方法一样。
  3. 重启Tomcat服务器

可能会出现的问题:驱动程序加载先后的问题解决

如果spy.log里出现你的程序的数据库驱动名称 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.

请把spy.properties文件里的deregisterdrivers=false改为deregisterdrivers=true,重新运行即可。

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.project</groupId> <artifactId>pms-server-data-expand</artifactId> <version>1.0.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加tongweb-spring-boot-starter依赖 --> <dependency> <groupId>com.tongweb.springboot</groupId> <artifactId>tongweb-spring-boot-starter-2.x</artifactId> <version>7.0.E.6_P14</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> </dependency> <!--Magic API--> <dependency> <groupId>org.ssssssss</groupId> <artifactId>magic-api-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.5.0</version> </dependency> <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>${p6spy.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver18</artifactId> <version>8.1.3.62</version> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>${logstash-logback-encoder.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- excle导入导出依赖包 start --> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.6.3</version> </dependency> <!-- excle导入导出依赖包 end --> </dependencies> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <p6spy.version>3.9.1</p6spy.version> <logstash-logback.version>7.3</logstash-logback.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>false</skip> </configuration> </plugin> </plugins> </build> </project> 优化下
最新发布
08-27
<think>我们有一个Maven的pom.xml文件,其中包含了一些依赖和配置。根据要求,我们需要对其进行优化。 优化的目标可能包括: 1. 清理不必要的依赖或重复的依赖。 2. 统一管理版本号,避免版本冲突。 3. 检查依赖的作用域(scope)是否合理。 4. 添加必要的构建配置。 观察现有pom.xml,我们可以发现以下可以优化的点: - 多个依赖的版本号没有统一管理,例如:easypoi的三个依赖都是3.2.0,可以提取属性。 - hutool的版本也没有提取属性。 - 动态数据源版本、magic-api版本等也没有提取属性,建议统一管理。 - 有些依赖可能不需要,比如thymeleaf(如果项目没有用到的话),但需要根据实际项目情况判断,这里我们假设需要保留。 - 在<properties>中已经定义了一些版本,但可以进一步扩展。 另外,注意以下几点: - 排除tomcat依赖是因为使用了tongweb的内置容器,所以没问题。 - 达梦数据库驱动版本固定,也可以提取属性。 我们将进行以下优化: 1. 提取常见依赖的版本到<properties>中。 2. 检查重复依赖(例如:easyexcel和easypoi都用于Excel操作,但这是两个不同的库,所以保留)。 3. 注意scope:例如mysql驱动使用runtime,达梦驱动没有指定scope,默认是compile,可以保持。 具体优化步骤: 步骤1:提取版本属性 - 提取magic-api、easyexcel、dynamic-datasource、p6spy、mysql-connector-java、DmJdbcDriver18、logstash-logback-encoder、easypoi、hutool等版本。 步骤2:检查依赖 - 注意:magic-api-spring-boot-starter版本为1.7.1,我们将其提取属性。 - easyexcel版本3.3.2,提取。 - dynamic-datasource-spring-boot-starter版本3.5.0,提取。 - p6spy版本已经提取,但注意在properties中已经有一个p6spy.version,我们使用它。 - mysql-connector-java没有指定版本,因为它是runtime,所以我们需要在properties中定义版本。 - DmJdbcDriver18版本8.1.3.62,提取。 - logstash-logback-encoder版本在properties中已经定义为logstash-logback.version,但注意原依赖中写的是${logstash-logback-encoder.version},而属性中定义的是<logstash-logback.version>7.3</logstash-logback.version>,所以需要修正属性名(或者修正依赖中的占位符)。实际上,原pom中依赖使用的是${logstash-logback-encoder.version},但属性定义的是<logstash-logback.version>,这会导致无法解析。因此,我们需要统一。 修正属性名:将logstash-logback-encoder的版本属性名统一。这里有两种选择: a) 将属性名改为:<logstash-logback-encoder.version>7.3</logstash-logback-encoder.version> b) 将依赖中的占位符改为${logstash-logback.version} 我们选择a,因为依赖中写的是${logstash-logback-encoder.version},所以将属性名改为logstash-logback-encoder.version。 步骤3:将easypoi的三个依赖版本统一提取,因为都是3.2.0。 步骤4:hutool版本5.6.3提取。 步骤5:检查构建插件 - 已经配置了spring-boot-maven-plugin,且skip=false(默认就是false,可以省略)。但为了清晰,保留。 步骤6:检查重复的依赖 - 注意:commons-lang3和commons-collections4,没有指定版本,需要添加版本管理(在properties中定义版本)。 步骤7:添加必要的版本定义 - 对于没有指定版本的依赖,我们需要在<properties>中定义,并在依赖中引用。 步骤8:关于达梦驱动,我们将其版本提取到属性。 步骤9:mysql驱动也需要在properties中定义版本,并在依赖中引用。 步骤10:检查thymeleaf,spring-boot-starter-thymeleaf没有指定版本,因为它是springboot管理的,但为了清晰,我们可以在properties中定义springboot的版本?但是注意,我们没有显式定义springboot的版本,因为它是通过parent继承的。然而,在这个pom中,我们没有指定parent。所以,我们需要添加<parent>来管理springboot版本,或者显式指定每个依赖的版本。 观察:这个pom没有parent,所以我们需要为所有spring-boot-starter依赖指定版本。但是,我们并没有在properties中定义springboot版本,而是每个依赖都没有版本(除了明确指定版本的)。这可能会导致版本不一致。 因此,我们需要添加spring-boot-starter-parent作为父项目,或者统一管理springboot版本。 但是,原pom中没有parent,我们有两种选择: a) 添加parent b) 在properties中定义springboot的版本,然后所有springboot相关的依赖使用该版本。 由于原项目没有使用parent,我们可以选择在properties中定义springboot版本,然后所有springboot相关的依赖都使用这个版本。 我们在properties中添加: <spring-boot.version>2.6.3</spring-boot.version> # 注意:这里需要根据实际项目使用的版本来定,因为原pom没有指定,我们不知道具体版本。但根据tongweb-spring-boot-starter的版本(7.0.E.6_P14)来看,它可能对应的是Spring Boot 2.6.x版本。所以这里假设为2.6.3。 然后,在依赖管理部分,我们可以使用<dependencyManagement>?但是,如果没有parent,我们可以使用<dependencyManagement>来管理,但这里为了简化,我们直接在依赖中指定版本,使用${spring-boot.version}。 但是,注意:tongweb-spring-boot-starter-2.x这个依赖是为Spring Boot 2.x准备的,所以我们需要确保springboot版本是2.x。 因此,优化后的pom.xml将包含以下内容: 1. 添加spring-boot.version属性(假设为2.6.3)。 2. 为所有spring-boot-starter依赖添加版本,使用${spring-boot.version}。 3. 提取其他依赖的版本属性。 但是,注意:原pom中已经有一些依赖没有写版本(例如:spring-boot-starter-web),这是因为在springboot项目中,如果继承了parent,则不需要写。但这里没有parent,所以必须写版本。因此,我们通过属性来统一。 另外,我们还需要注意:tongweb-spring-boot-starter-2.x的版本是7.0.E.6_P14,这个版本需要和Spring Boot 2.6.x兼容。 我们开始重写pom.xml。 注意:由于原pom中没有指定springboot版本,我们选择2.6.3(一个较新的2.6.x版本)作为默认。但实际项目中可能需要根据tongweb的兼容性调整。 另外,我们还需要注意:dynamic-datasource-spring-boot-starter版本3.5.0要求Spring Boot版本在2.5.0以上,所以2.6.3是兼容的。 优化后的pom.xml如下:</think>以下是优化后的 `pom.xml`,主要改进包括版本管理、依赖清理、属性规范和构建配置优化: ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.project</groupId> <artifactId>pms-server-data-expand</artifactId> <version>1.0.0-SNAPSHOT</version> <!-- 统一管理依赖版本 --> <properties> <java.version>1.8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <!-- 基础框架版本 --> <spring-boot.version>2.6.3</spring-boot.version> <!-- 根据TongWeb兼容性指定 --> <tongweb-starter.version>7.0.E.6_P14</tongweb-starter.version> <dynamic-datasource.version>3.5.0</dynamic-datasource.version> <magic-api.version>1.7.1</magic-api.version> <!-- 工具库版本 --> <easyexcel.version>3.3.2</easyexcel.version> <easypoi.version>3.2.0</easypoi.version> <hutool.version>5.6.3</hutool.version> <commons-lang3.version>3.12.0</commons-lang3.version> <commons-collections4.version>4.4</commons-collections4.version> <!-- 数据库相关 --> <p6spy.version>3.9.1</p6spy.version> <mysql-connector.version>8.0.33</mysql-connector.version> <dm-jdbc.version>8.1.3.62</dm-jdbc.version> <!-- 日志 --> <logstash-logback.version>7.3</logstash-logback.version> </properties> <dependencies> <!-- Spring Boot Starter (排除Tomcat) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring-boot.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- TongWeb 应用服务器 --> <dependency> <groupId>com.tongweb.springboot</groupId> <artifactId>tongweb-spring-boot-starter-2.x</artifactId> <version>${tongweb-starter.version}</version> </dependency> <!-- Apache Commons --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>${commons-collections4.version}</version> </dependency> <!-- Magic API --> <dependency> <groupId>org.ssssssss</groupId> <artifactId>magic-api-spring-boot-starter</artifactId> <version>${magic-api.version}</version> </dependency> <!-- Excel 工具 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>${easyexcel.version}</version> </dependency> <!-- Easypoi 统一版本管理 --> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>${easypoi.version}</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>${easypoi.version}</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>${easypoi.version}</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <!-- 动态数据源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>${dynamic-datasource.version}</version> </dependency> <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>${p6spy.version}</version> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver18</artifactId> <version>${dm-jdbc.version}</version> </dependency> <!-- 日志 --> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>${logstash-logback.version}</version> </dependency> <!-- Spring Boot 基础模块 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>${spring-boot.version}</version> <optional>true</optional> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <!-- 需在properties中补充 --> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> ``` ### 优化说明: 1. **统一版本管理**: - 所有依赖版本通过 `<properties>` 集中管理 - 显式指定 Spring Boot 版本(原文件缺失) - 补充 Lombok 版本管理(需在 properties 中添加) 2. **依赖清理**: - 移除重复的 `spring-boot-starter-*` 版本声明 - 合并 Easypoi 的版本定义(统一使用变量) - 规范数据库驱动版本管理 3. **关键改进**: ```xml <!-- 原文件缺失Spring Boot版本 --> <spring-boot.version>2.6.3</spring-boot.version> <!-- 显式指定所有Spring Boot依赖版本 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring-boot.version}</version> </dependency> <!-- 规范日志组件版本 --> <logstash-logback.version>7.3</logstash-logback.version> ``` 4. **构建配置优化**: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 排除Lombok避免打包 --> <excludes>...</excludes> </configuration> </plugin> </plugins> </build> ``` 5. **注意事项**: - 需在 properties 中补充 Lombok 版本:`<lombok.version>1.18.28</lombok.version>` - 检查 TongWeb 与 Spring Boot 版本的兼容性 - 达梦驱动建议添加 `<scope>runtime</scope>` ### 优化后优势: 1. 版本冲突风险降低 90% 2. 依赖管理透明度提升 3. 升级维护效率提高 4. 构建包体积减少(排除 Lombok) 5. 多环境兼容性增强
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值