SpringBoot使用Druid+Jpa(轉載)
Druid 簡介
Druid是阿里巴巴開源的資料庫連線池,號稱是Java語言中最好的資料庫連線池,能夠提供強大的監控和擴充套件功能。GitHub地址:https://github.com/alibaba/druid。
Druid有以下優點:
- 可以監控資料庫訪問效能,Druid內建提供了一個功能強大的StatFilter外掛,能夠詳細統計SQL的執行效能,這對於線上分析資料庫訪問效能有幫助。
- 替換DBCP和C3P0,Druid提供了一個高效、功能強大、可擴充套件性好的資料庫連線池。
- 資料庫密碼加密。直接把資料庫密碼寫在配置檔案中,這是不好的行為,容易導致安全問題。DruidDriver和DruidDataSource都支援PasswordCallback。
- SQL執行日誌,Druid提供了不同的LogFilter,能夠支援Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的資料庫訪問情況。
- 擴充套件JDBC,如果你要對JDBC層有程式設計的需求,可以通過Druid提供的Filter-Chain機制,很方便編寫JDBC層的擴充套件外掛。
本文將對如何在Springboot中使用Druid資料庫連線池進行簡單示例和介紹,為簡單起見,本文使用了Spring Jpa來進行資料庫操作,專案的完整目錄層次如下圖所示。
新增依賴與配置
///為了使用Druid和Spring Data JPA,需要在工程POM檔案中引入它們的Maven依賴。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 新增MySQL依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 新增JPA依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 新增druid依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
在application.yml 核心配置檔案中除了要定義MYSQL資料庫連線資訊外,還需要新增如下JPA相關配置。
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
platform: mysql
type: com.alibaba.druid.pool.DruidDataSource
# 下面為連線池的補充設定,應用到上面所有資料來源中
# 初始化大小,最小,最大
initialSize: 1
minIdle: 3
maxActive: 20
# 配置獲取連線等待超時的時間
maxWait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一個連線在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 開啟PSCache,並且指定每個連線上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆
filters: stat,wall,log4j
# 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合併多個DruidDataSource的監控資料
#useGlobalDataSourceStat: true
jpa:
# 配置 DBMS 型別
database: MYSQL
# 配置是否將執行的 SQL 輸出到日誌
show-sql: true
properties:
hibernate:
hbm2ddl:
# 配置開啟自動更新表結構
auto: update
配置資料來源
在Spring中使用Druid資料來源非常簡單方便,只需要建立一個DruidDataSource型別的資料來源並將其納入到Spring容器中進行管理即可。
@ConfigurationProperties(prefix = "spring.datasource")
public class DruidDataSourceConfig {
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize;
private int minIdle;
private int maxActive;
private int maxWait;
private int timeBetweenEvictionRunsMillis;
private int minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
private String filters;
private String connectionProperties;
// 解決 spring.datasource.filters=stat,wall,log4j 無法正常註冊
@Bean
@Primary // 在同樣的DataSource中,首先使用被標註的DataSource
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
// configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
System.err.println("druid configuration initialization filter: " + e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
// 此處省略屬性的get和set方法
}
配置Druid監控統計功能
基於Druid的Filter-Chain擴充套件機制,Druid提供了3個非常有用的具有監控統計功能的Filter:
- StatFilter 用於統計監控資訊; WallFilter 基於SQL語義分析來實現防禦
- SQL注入攻擊; LogFilter
- 用於輸出JDBC執行的日誌。
如果在專案中需要使用Druid提供的這些監控統計功能,可以通過以下兩種途徑進行配置。
方式一(基於Servlet 3.0 註解的配置)
對於使用Servlet 3.0的專案,在啟動類上加上註解 @ServletComponentScan 啟用Servlet自動掃描,並在自定義的Servlet或Filter上加上註解@WebServlet或@WebFilter使其能夠被自動發現。
@SpringBootApplication
@ServletComponentScan
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
/**
* druid資料來源狀態監控.
*/
@WebServlet(urlPatterns = "/druid/*", initParams = {
// IP白名單 (沒有配置或者為空,則允許所有訪問)
@WebInitParam(name = "allow", value = "192.168.1.101,127.0.0.1"),
// IP黑名單 (存在共同時,deny優先於allow)
@WebInitParam(name = "deny", value = "192.168.1.100"),
// 使用者名稱
@WebInitParam(name = "loginUsername", value = "admin"),
// 密碼
@WebInitParam(name = "loginPassword", value = "admin"),
// 禁用HTML頁面上的“Reset All”功能
@WebInitParam(name = "resetEnable", value = "false") })
@SuppressWarnings("serial")
public class DruidStatViewServlet extends StatViewServlet {
}
/**
* druid過濾器.
*/
@WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*", initParams = {
// 忽略資源
@WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*") })
public class DruidStatFilter extends WebStatFilter {
}
方式二(基於Spring註解的配置)
使用Spring的註解@Bean對自定義的Servlet或Filter進行註冊,Servlet使用ServletRegistrationBean進行註冊,Filter使用FilterRegistrationBean進行註冊。
@SpringBootConfiguration
public class DruidMonitorConfig {
private static final Logger logger = LoggerFactory.getLogger(DruidMonitorConfig.class);
@Bean
public ServletRegistrationBean servletRegistrationBean() {
logger.info("init Druid Monitor Servlet ...");
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),
"/druid/*");
// IP白名單
servletRegistrationBean.addInitParameter("allow", "192.168.1.101,127.0.0.1");
// IP黑名單(共同存在時,deny優先於allow)
servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
// 控制檯管理使用者
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
// 是否能夠重置資料 禁用HTML頁面上的“Reset All”功能
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
配置JPA
建立一個使用者POJO實體類,用來進行示例。
@Entity
@Table(name = "tbl_user") // 指定關聯的資料庫的表名
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 主鍵ID
private String name; // 姓名
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
再建立一個使用者的資料庫訪問資源庫介面。
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
}
在UserController控制器中新增兩個方法,一個用來新增使用者,一個用來檢視所有使用者。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRepository userRepository;
@RequestMapping("/add")
public Object add(@RequestParam(name = "name", required = true) String name) {
User user = new User();
user.setName(name);
userRepository.save(user);
return user;
}
@RequestMapping("/list")
public Object list() {
Iterable<User> users = userRepository.findAll();
return users;
}
}
應用測試
啟動應用,先訪問地址:http://localhost:8080/user/add?name=Tracy,為使用者新增一個姓名為Tracy的使用者。
再訪問地址:http://localhost:8080/user/list,檢視所有使用者。
最後訪問地址:http://localhost:8080/druid/,登入之後,即可檢視Druid資料來源的配置及SQL統計情況。
作者:pengjunlee
來源:CSDN
原文:https://blog.csdn.net/pengjunlee/article/details/80061797
版權宣告:本文為博主原創文章,轉載請附上博文連結!