在现代的Java开发中,Spring Boot已经成为了构建Web应用的首选框架,它以其简洁的配置和强大的功能受到了广大开发者的喜爱。而Druid是阿里巴巴开源的一个高性能的数据库连接池,它不仅提供了强大的监控功能,还具备优秀的性能和稳定性。将Spring Boot与Druid数据源集成,可以让我们在开发过程中更好地管理数据库连接,提高应用的性能和可维护性。本文将详细介绍Spring Boot集成Druid数据源的方法。

一、创建Spring Boot项目

首先,我们需要创建一个Spring Boot项目。可以使用Spring Initializr(https://start.spring.io/)来快速生成项目骨架。在Spring Initializr中,选择以下配置:

Project: Maven Project

Language: Java

Spring Boot: 选择合适的版本

Dependencies: 添加Spring Web、Spring Data JPA、MySQL Driver(根据实际使用的数据库选择)

点击“Generate”按钮下载项目压缩包,解压后导入到IDE中。

二、添加Druid依赖

在项目的pom.xml文件中添加Druid的依赖。在dependencies标签内添加以下代码:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.11</version>
</dependency>

这里使用的是Druid的Spring Boot Starter,它可以帮助我们更方便地集成Druid到Spring Boot项目中。添加完依赖后,Maven会自动下载相关的jar包。

三、配置Druid数据源

在项目的application.properties或application.yml文件中配置Druid数据源。以下是使用application.yml的示例:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    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
      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=500

下面对这些配置项进行详细解释:

spring.datasource.url: 数据库连接的URL,根据实际情况修改数据库名、主机名、端口等信息。

spring.datasource.username: 数据库用户名。

spring.datasource.password: 数据库密码。

spring.datasource.driver-class-name: 数据库驱动类名。

spring.datasource.type: 指定数据源类型为DruidDataSource。

druid.initial-size: 初始化连接池的连接数量。

druid.min-idle: 连接池中的最小空闲连接数。

druid.max-active: 连接池中的最大活动连接数。

druid.max-wait: 获取连接时的最大等待时间,单位为毫秒。

druid.time-between-eviction-runs-millis: 空闲连接回收的时间间隔,单位为毫秒。

druid.min-evictable-idle-time-millis: 连接池中连接的最小空闲时间,单位为毫秒。

druid.validation-query: 用于验证连接是否有效的SQL语句。

druid.test-while-idle: 是否在连接空闲时进行有效性检查。

druid.test-on-borrow: 是否在获取连接时进行有效性检查。

druid.test-on-return: 是否在归还连接时进行有效性检查。

druid.pool-prepared-statements: 是否缓存PreparedStatement。

druid.max-pool-prepared-statement-per-connection-size: 每个连接缓存PreparedStatement的最大数量。

druid.filters: 配置Druid的过滤器,这里使用了stat(统计)、wall(防火墙)和log4j(日志)。

druid.connection-properties: 连接属性,用于配置统计信息。

四、配置Druid监控

Druid提供了强大的监控功能,我们可以通过配置来启用它。在Spring Boot项目中,可以创建一个配置类来配置Druid的监控。以下是示例代码:

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DruidConfig {

    @Bean
    public ServletRegistrationBean<StatViewServlet> statViewServlet() {
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        // 白名单
        registrationBean.addInitParameter("allow", "127.0.0.1");
        // 黑名单
        registrationBean.addInitParameter("deny", "");
        // 登录用户名
        registrationBean.addInitParameter("loginUsername", "admin");
        // 登录密码
        registrationBean.addInitParameter("loginPassword", "admin");
        // 是否能够重置数据
        registrationBean.addInitParameter("resetEnable", "false");
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean<WebStatFilter> webStatFilter() {
        FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(new WebStatFilter());
        // 添加过滤规则
        filterRegistrationBean.addUrlPatterns("/*");
        // 忽略过滤的格式
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

在上述代码中,我们创建了一个配置类DruidConfig,其中:

statViewServlet方法用于注册Druid的监控Servlet,通过访问/druid/*路径可以查看Druid的监控信息。我们可以设置白名单、黑名单、登录用户名和密码等信息。

webStatFilter方法用于注册Druid的WebStatFilter,它可以对Web请求进行统计。我们可以设置过滤规则和忽略过滤的格式。

五、测试Druid数据源

为了验证Druid数据源是否集成成功,我们可以创建一个简单的测试类。以下是示例代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@Component
public class DataSourceTest implements CommandLineRunner {

    @Autowired
    private DataSource dataSource;

    @Override
    public void run(String... args) throws Exception {
        try (Connection connection = dataSource.getConnection()) {
            System.out.println("连接成功,数据库连接对象: " + connection);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们创建了一个实现CommandLineRunner接口的类DataSourceTest,在run方法中获取数据库连接并打印连接信息。如果能够成功获取连接并打印信息,说明Druid数据源集成成功。

六、使用Druid数据源进行数据库操作

在集成了Druid数据源后,我们可以像使用普通数据源一样进行数据库操作。例如,使用Spring Data JPA进行数据库操作。以下是一个简单的示例:

首先,创建一个实体类:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

    // 省略getter和setter方法
}

然后,创建一个Repository接口:

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

最后,在Service类中使用Repository进行数据库操作:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public User saveUser(User user) {
        return userRepository.save(user);
    }
}

在上述代码中,我们创建了一个User实体类和一个UserRepository接口,然后在UserService类中使用UserRepository进行数据库操作。这样,我们就可以使用Druid数据源进行数据库的增删改查操作了。

通过以上步骤,我们成功地将Spring Boot与Druid数据源集成,并实现了数据库操作和监控功能。Druid数据源的高性能和强大的监控能力可以帮助我们更好地管理数据库连接,提高应用的性能和可维护性。在实际开发中,我们可以根据具体需求对Druid的配置进行调整,以满足不同的业务场景。