下面是 Spring Boot 项目整合 Druid 数据库连接池的实现的完整攻略。
1. 引入 Druid 依赖
在Maven或Gradle项目中,需要在项目依赖中引入 Druid 数据库连接池的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
2. 配置 Druid 数据库连接池
在 application.yml(或 application.properties)中添加以下配置,进行 Druid 数据库连接池的基本配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?characterEncoding=utf-8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
# Druid 连接池相关配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
filters: stat, wall, log4j
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
其中,
spring.datasource.type
指定了 Druid 数据源的类型。spring.datasource.url
、spring.datasource.username
、spring.datasource.password
、spring.datasource.driver-class-name
分别对应数据库连接的 URL、用户名、密码和驱动类。druid.*
则是 Druid 数据源的相关配置,这里配置了初始连接数、最小闲置连接数、最大活跃连接数、最长等待时间(毫秒)、连接保持时间、连接校验 SQL(查询一个假表)以及其他一些配置项,可以根据实际情况进行调整。
3. 配置 Druid 监控页面
要使用 Druid 的监控页面,需要先在 Spring Boot 项目中配置一个 Servlet:
@WebServlet(urlPatterns = "/druid/*",
initParams = {
@WebInitParam(name = "loginUsername", value = "admin"), // Druid 监控页面登录用户名
@WebInitParam(name = "loginPassword", value = "admin") // Druid 监控页面登录密码
})
public class DruidStatViewServlet extends StatViewServlet {
}
然后再配置一个 Filter,用于对 Druid 的监控统计功能进行配置:
@WebFilter(filterName = "druidWebStatFilter",
urlPatterns = "/*",
initParams = {
@WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*") // 忽略资源
})
public class DruidWebStatFilter extends WebStatFilter {
}
这两个类需要在 Spring Boot 项目中进行注册,可以采用以下两种方法:
(1)在应用主类中实现 ServletRegistrationBean
和 FilterRegistrationBean
的 @Bean
方法:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public ServletRegistrationBean druidStatViewServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new DruidStatViewServlet(), "/druid/*");
// 配置登录名密码是否能修改
servletRegistrationBean.addInitParameter("allow", "");
servletRegistrationBean.addInitParameter("deny", "192.168.15.21");
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean druidWebStatFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
// 忽略静态资源
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
(2)在一个配置类中增加 ServletRegistrationBean
和 FilterRegistrationBean
的 @Bean
方法:
@Configuration
public class DruidConfig {
@Bean
public ServletRegistrationBean druidStatViewServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new DruidStatViewServlet(), "/druid/*");
// 配置登录名密码是否能修改
servletRegistrationBean.addInitParameter("allow", "");
servletRegistrationBean.addInitParameter("deny", "192.168.15.21");
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean druidWebStatFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
// 忽略静态资源
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
4. 示例
以下示例演示了如何在 Spring Boot 中使用 Druid 数据库连接池:
@RestController
public class TestController {
@Autowired
private DataSource dataSource;
@GetMapping("/test")
public List<Map<String, Object>> test() throws SQLException {
try (Connection conn = dataSource.getConnection()) {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test");
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
List<Map<String, Object>> list = new ArrayList<>();
while (rs.next()) {
Map<String, Object> map = new LinkedHashMap<>(columnCount);
for (int i = 1; i <= columnCount; i++) {
map.put(metaData.getColumnLabel(i), rs.getObject(i));
}
list.add(map);
}
return list;
}
}
}
在该控制器中,使用 @Autowired
注解注入了 DataSource
,然后在接口 test()
中使用该数据源进行 SQL 查询操作。
5. 注意事项
在整合 Druid 数据源时需要注意以下几点:
- 如果采用 Druid 数据库连接池,就不用再进行 HikariCP 或者 Tomcat JDBC Pool 等连接池的配置了。
- 如果项目使用的数据库连接驱动文档编码与数据库文档编码不同,应在 JDBC URL 中增加
useUnicode=true&characterEncoding=UTF-8
等参数。 - Druid 监控页面的配置项需要根据实际情况进行调整。
- Druid 数据源需要自己维护连接池中的连接,以及在应用关闭时关闭连接池中所有的连接,可以使用 Spring Boot 为 Bean 容器管理的数据源自动关闭 DataSource。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot项目整合druid数据库连接池的实现 - Python技术站