本文旨在指导开发者如何在 spring Boot 2.x 项目中配置多个数据源,并集成 P6Spy 数据库监控工具。通过详细的配置步骤和示例代码,帮助读者解决在集成过程中可能遇到的问题,实现对多个数据源的性能监控和sql语句的拦截。
多数据源配置
spring boot 提供了方便的多数据源配置方式,允许应用连接到多个数据库。以下是一个基于 application.yaml 配置文件的示例:
app: db1: jdbc-url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC username: user1 password: password1 db2: jdbc-url: jdbc:postgresql://localhost:5432/db2 username: user2 password: password2
对应的 Java 配置类如下:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; @Configuration(proxyBeanMethods = false) public class DataSourceConfig { @Bean(name = "db1") @Primary @ConfigurationProperties("app.db1") public DataSource db1DataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "db2") @ConfigurationProperties("app.db2") public DataSource db2DataSource() { return DataSourceBuilder.create().build(); } }
在这个配置中,@ConfigurationProperties 注解会将 application.yaml 中以 app.db1 和 app.db2 开头的属性绑定到对应的 DataSource 实例。@Primary 注解指定 db1 数据源为默认数据源。
在需要使用特定数据源的地方,可以使用 @Autowired 和 @Qualifier 注解来注入:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; @Service public class MyService { @Autowired @Qualifier("db2") private DataSource db2DataSource; public void doSomethingWithDb2() throws SQLException { try (Connection connection = db2DataSource.getConnection()) { // 使用 db2 连接执行数据库操作 System.out.println("Connected to db2: " + connection.getMetaData().getURL()); } } }
集成 P6Spy
P6Spy 是一个开源的 Java EE 数据库监控工具,可以拦截和记录 SQL 语句,方便开发者进行性能分析和问题排查。
添加依赖
首先,需要在 pom.xml 文件中添加 P6Spy 的依赖:
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.1</version> </dependency>
请根据实际情况选择合适的 P6Spy 版本。
配置 spy.properties
P6Spy 的配置文件 spy.properties 用于配置 P6Spy 的行为。需要在 src/main/resources 目录下创建该文件,并添加以下配置:
driverlist=com.mysql.cj.jdbc.Driver,org.postgresql.Driver modulelist=com.p6spy.engine.spy.module.P6SpyModule appender=com.p6spy.engine.spy.appender.StdoutLogger logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat dateformat=yyyy-MM-dd HH:mm:ss excludepattern=.*schema_version.*
- driverlist: 指定需要监控的数据库驱动列表。请根据实际使用的数据库驱动进行配置。多个驱动之间用逗号分隔。
- modulelist: 指定 P6Spy 使用的模块。
- appender: 指定日志输出方式,这里使用标准输出。
- logMessageFormat: 指定日志消息格式。
- dateformat: 指定日期格式。
- excludepattern: 指定需要排除的sql语句,使用正则表达式。
配置数据源
修改 DataSourceConfig 类,使用 P6DataSource 包装数据源:
import com.p6spy.engine.spy.P6DataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; @Configuration(proxyBeanMethods = false) public class DataSourceConfig { @Bean(name = "db1") @Primary @ConfigurationProperties("app.db1") public DataSource db1DataSource() { DataSource dataSource = DataSourceBuilder.create().build(); return new P6DataSource(dataSource); } @Bean(name = "db2") @ConfigurationProperties("app.db2") public DataSource db2DataSource() { DataSource dataSource = DataSourceBuilder.create().build(); return new P6DataSource(dataSource); } }
或者,可以使用 DataSourceBuilder 指定 type 为 P6DataSource.class,但需要确保 spy.properties 中配置了 realdatasource 属性,指向真实数据源的 JNDI 名称或类名。 推荐使用上面的方法,直接包装 DataSource。
注意事项
- 确保 spy.properties 文件存在于 src/main/resources 目录下。
- driverlist 属性需要包含所有使用到的数据库驱动。
- 如果使用 JNDI 数据源,需要在 spy.properties 中配置 realdatasource 属性。
- P6Spy 会拦截所有通过 DataSource 获取的连接执行的 SQL 语句,并将其输出到配置的日志输出方式中。
总结
通过以上步骤,就可以在 Spring Boot 2.x 项目中成功配置多个数据源,并集成 P6Spy 进行数据库监控。 这种方式可以方便地监控和分析数据库的性能,帮助开发者及时发现和解决问题。 请根据实际情况调整配置,以满足项目的需求。
评论(已关闭)
评论已关闭