在現(xiàn)代的Java開發(fā)中,Spring Boot已經成為了構建Web應用的首選框架,它以其簡潔的配置和強大的功能受到了廣大開發(fā)者的喜愛。而Druid是阿里巴巴開源的一個高性能的數(shù)據(jù)庫連接池,它不僅提供了強大的監(jiān)控功能,還具備優(yōu)秀的性能和穩(wěn)定性。將Spring Boot與Druid數(shù)據(jù)源集成,可以讓我們在開發(fā)過程中更好地管理數(shù)據(jù)庫連接,提高應用的性能和可維護性。本文將詳細介紹Spring Boot集成Druid數(shù)據(jù)源的方法。
一、創(chuàng)建Spring Boot項目
首先,我們需要創(chuàng)建一個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(根據(jù)實際使用的數(shù)據(jù)庫選擇)
點擊“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數(shù)據(jù)源
在項目的application.properties或application.yml文件中配置Druid數(shù)據(jù)源。以下是使用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: 數(shù)據(jù)庫連接的URL,根據(jù)實際情況修改數(shù)據(jù)庫名、主機名、端口等信息。
spring.datasource.username: 數(shù)據(jù)庫用戶名。
spring.datasource.password: 數(shù)據(jù)庫密碼。
spring.datasource.driver-class-name: 數(shù)據(jù)庫驅動類名。
spring.datasource.type: 指定數(shù)據(jù)源類型為DruidDataSource。
druid.initial-size: 初始化連接池的連接數(shù)量。
druid.min-idle: 連接池中的最小空閑連接數(shù)。
druid.max-active: 連接池中的最大活動連接數(shù)。
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的最大數(shù)量。
druid.filters: 配置Druid的過濾器,這里使用了stat(統(tǒng)計)、wall(防火墻)和log4j(日志)。
druid.connection-properties: 連接屬性,用于配置統(tǒng)計信息。
四、配置Druid監(jiān)控
Druid提供了強大的監(jiān)控功能,我們可以通過配置來啟用它。在Spring Boot項目中,可以創(chuàng)建一個配置類來配置Druid的監(jiān)控。以下是示例代碼:
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");
// 是否能夠重置數(shù)據(jù)
registrationBean.addInitParameter("resetEnable", "false");
return registrationBean;
}
@Bean
public FilterRegistrationBean<WebStatFilter> webStatFilter() {
FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(new WebStatFilter());
// 添加過濾規(guī)則
filterRegistrationBean.addUrlPatterns("/*");
// 忽略過濾的格式
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}在上述代碼中,我們創(chuàng)建了一個配置類DruidConfig,其中:
statViewServlet方法用于注冊Druid的監(jiān)控Servlet,通過訪問/druid/*路徑可以查看Druid的監(jiān)控信息。我們可以設置白名單、黑名單、登錄用戶名和密碼等信息。
webStatFilter方法用于注冊Druid的WebStatFilter,它可以對Web請求進行統(tǒng)計。我們可以設置過濾規(guī)則和忽略過濾的格式。
五、測試Druid數(shù)據(jù)源
為了驗證Druid數(shù)據(jù)源是否集成成功,我們可以創(chuàng)建一個簡單的測試類。以下是示例代碼:
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("連接成功,數(shù)據(jù)庫連接對象: " + connection);
} catch (SQLException e) {
e.printStackTrace();
}
}
}在上述代碼中,我們創(chuàng)建了一個實現(xiàn)CommandLineRunner接口的類DataSourceTest,在run方法中獲取數(shù)據(jù)庫連接并打印連接信息。如果能夠成功獲取連接并打印信息,說明Druid數(shù)據(jù)源集成成功。
六、使用Druid數(shù)據(jù)源進行數(shù)據(jù)庫操作
在集成了Druid數(shù)據(jù)源后,我們可以像使用普通數(shù)據(jù)源一樣進行數(shù)據(jù)庫操作。例如,使用Spring Data JPA進行數(shù)據(jù)庫操作。以下是一個簡單的示例:
首先,創(chuàng)建一個實體類:
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方法
}然后,創(chuàng)建一個Repository接口:
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}最后,在Service類中使用Repository進行數(shù)據(jù)庫操作:
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);
}
}在上述代碼中,我們創(chuàng)建了一個User實體類和一個UserRepository接口,然后在UserService類中使用UserRepository進行數(shù)據(jù)庫操作。這樣,我們就可以使用Druid數(shù)據(jù)源進行數(shù)據(jù)庫的增刪改查操作了。
通過以上步驟,我們成功地將Spring Boot與Druid數(shù)據(jù)源集成,并實現(xiàn)了數(shù)據(jù)庫操作和監(jiān)控功能。Druid數(shù)據(jù)源的高性能和強大的監(jiān)控能力可以幫助我們更好地管理數(shù)據(jù)庫連接,提高應用的性能和可維護性。在實際開發(fā)中,我們可以根據(jù)具體需求對Druid的配置進行調整,以滿足不同的業(yè)務場景。