1. 程式人生 > >SpringBoot使用Druid+Jpa(轉載)

SpringBoot使用Druid+Jpa(轉載)

Druid 簡介
Druid是阿里巴巴開源的資料庫連線池,號稱是Java語言中最好的資料庫連線池,能夠提供強大的監控和擴充套件功能。GitHub地址:https://github.com/alibaba/druid。
Druid有以下優點:

  1. 可以監控資料庫訪問效能,Druid內建提供了一個功能強大的StatFilter外掛,能夠詳細統計SQL的執行效能,這對於線上分析資料庫訪問效能有幫助。
  2. 替換DBCP和C3P0,Druid提供了一個高效、功能強大、可擴充套件性好的資料庫連線池。
  3. 資料庫密碼加密。直接把資料庫密碼寫在配置檔案中,這是不好的行為,容易導致安全問題。DruidDriver和DruidDataSource都支援PasswordCallback。
  4. SQL執行日誌,Druid提供了不同的LogFilter,能夠支援Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的資料庫訪問情況。
  5. 擴充套件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
版權宣告:本文為博主原創文章,轉載請附上博文連結!