亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Spring Boot 集成 Druid 數據源

1. 前言

首先要理解數據源的作用,數據源實際上是一個接口 javax.sql.DataSource 。 Spring Boot 在操作數據庫時,是通過數據源類型的組件實現的。

數據源的類型有很多,但是都實現了 javax.sql.DataSource 接口,所以 Spring Boot 可以盡情地更換各類數據源以實現不同的需求。

其中 Druid 數據源就是數據源中比較出類拔萃的存在,而且是阿里開發的。國人出品的東西,咱們能支持的必須得支持啊,當然這是建立在人家做的確實好的基礎上。

圖片描述

Druid 是阿里巴巴數據庫事業部出品

本篇我們使用 Druid 替換默認的數據源,然后做一下性能對比測試。網上有很多文章寫 Druid 性能如何如何強悍,但是很多并沒有事實依據。我們做程序員還是要嚴謹,相信實踐是檢驗真理的唯一標準。所以本篇的內容就是研究下 Druid 如何使用,及其性能到底是否足夠優異。

2. 使用默認數據源(HikariDataSource)

Spring Boot 2.2.5 版本使用的默認數據源是 HikariDataSource ,該數據源號稱擁有全世界最快的數據庫連接池,嗯,我們來試試它的深淺。

2.1 準備數據庫

還是使用之前的商城數據庫(shop)及商品信息數據表(goods),表結構如下:

實例:

CREATE TABLE `goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一編號',
  `name` varchar(255) DEFAULT '' COMMENT '商品名稱',
  `price` decimal(10,2) DEFAULT '0.00' COMMENT '商品價格',
  `pic` varchar(255) DEFAULT '' COMMENT '圖片文件名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2 使用 Spring Initializr 創建項目

Spring Boot 版本選擇 2.2.5 , Group 為 com.imooc , Artifact 為 spring-boot-hikari ,生成項目后導入 Eclipse 開發環境。

2.3 引入項目依賴

我們引入 Web 項目依賴、熱部署依賴。由于本項目需要訪問數據庫,所以引入 spring-boot-starter-jdbc 依賴和 mysql-connector-java 依賴。

pom.xml 文件中依賴項如下:

實例:

	    <!-- 熱部署 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<!-- web -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- jdbc -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<!-- myql驅動 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

2.4 構建商品類和商品數據訪問類

定義商品類,對應商品表:

實例:

/**
 * 商品類
 */
public class GoodsDo {
	/**
	 * 商品id
	 */
	private Long id;
	/**
	 * 商品名稱
	 */
	private String name;
	/**
	 * 商品價格
	 */
	private String price;
	/**
	 * 商品圖片
	 */
	private String pic;
	// 省略get set方法
}

定義商品數據庫訪問類:

實例:

/**
 * 商品數據庫訪問類
 */
@Repository // 標注數據訪問類
public class GoodsDao {
	@Autowired
	private JdbcTemplate jdbcTemplate;

	/**
	 * 新增
	 */
	public void insert(GoodsDo goods) {
		jdbcTemplate.update("insert into goods(name,price,pic)values(?,?,?)", goods.getName(), goods.getPrice(),
				goods.getPic());
	}

	/**
	 * 刪除
	 */
	public void delete(Long id) {
		jdbcTemplate.update("delete from goods where id =?", id);
	}

	/**
	 * 更新
	 */
	public void update(GoodsDo goods) {
		jdbcTemplate.update("update goods set name=?,price=?,pic=? where id=?", goods.getName(), goods.getPrice(),
				goods.getPic(), goods.getId());
	}

	/**
	 * 按id查詢
	 */
	public GoodsDo getById(Long id) {
		return jdbcTemplate.queryForObject("select * from goods where id=?", new RowMapper<GoodsDo>() {
			@Override
			public GoodsDo mapRow(ResultSet rs, int rowNum) throws SQLException {
				GoodsDo goods = new GoodsDo();
				goods.setId(rs.getLong("id"));
				goods.setName(rs.getString("name"));
				goods.setPrice(rs.getString("price"));
				goods.setPic(rs.getString("pic"));
				return goods;
			}
		}, id);
	}

	/**
	 * 查詢商品列表
	 */
	public List<GoodsDo> getList() {
		return jdbcTemplate.query("select * from goods", new RowMapper<GoodsDo>() {
			@Override
			public GoodsDo mapRow(ResultSet rs, int rowNum) throws SQLException {
				GoodsDo goods = new GoodsDo();
				goods.setId(rs.getLong("id"));
				goods.setName(rs.getString("name"));
				goods.setPrice(rs.getString("price"));
				goods.setPic(rs.getString("pic"));
				return goods;
			}
		});
	}
}

2.5 配置數據源信息

通過配置文件,設置數據源信息。

實例:

# 配置數據庫驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置數據庫url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
# 配置數據庫用戶名
spring.datasource.username=root
# 配置數據庫密碼
spring.datasource.password=Easy@0122

2.6 測試

通過測試類發起測試,此處我們簡單執行 1000 次插入,看看執行時間。

需要注意的是,Spring Boot 進行測試時,需要添加注解 @SpringBootTest 。添加注解后該類可以直接通過 @Test 標注的方法發起單元測試,容器環境都已準備好,非常方便。

實例:

@SpringBootTest // 通過該注解,開啟測試類功能,當測試方法啟動時,啟動了Spring容器
class SpringBootHikariApplicationTests {
	@Autowired
	private DataSource dataSource;// 自動注入數據源
	@Autowired
	private GoodsDao goodsDao;

	/**
	 * 打印數據源信息
	 */
	@Test // 測試方法
	void printDataSource() {
		System.out.println(dataSource);
	}

	/**
	 * 批量插入測試
	 */
	@Test
	void insertBatch() {
		// 開始時間
		long startTime = System.currentTimeMillis();
		// 執行1000次插入
		GoodsDo goods = new GoodsDo();
		goods.setName("測試");
		goods.setPic("測試圖片");
		goods.setPrice("1.0");
		for (int i = 0; i < 1000; i++) {
			goodsDao.insert(goods);
		}
		// 輸出操作時間
		System.out.println("use time:" + (System.currentTimeMillis() - startTime)+"ms");
	}
}

輸出結果如下,可見默認數據源類型為 HikariDataSource ,插入 1000 條數據的時間大概為 1500ms (注意時間可能跟電腦性能等很多因素相關,此處只是進行簡單的對比測試)。

use time:1518ms
com.zaxxer.hikari.HikariDataSource

3. 使用 Druid 數據源

接下來我們使用 Druid 數據源進行對比測試。

3.1 準備數據庫

與上面的商城數據庫(shop)及商品信息數據表(goods)一致。

3.2 使用 Spring Initializr 創建項目

Spring Boot 版本選擇 2.2.5 , Group 為 com.imooc , Artifact 為 spring-boot-druid ,生成項目后導入 Eclipse 開發環境。

3.3 引入項目依賴

我們引入 Web 項目依賴、熱部署依賴。由于本項目需要訪問數據庫,所以引入 spring-boot-starter-jdbc 依賴和 mysql-connector-java 依賴,由于使用 Druid ,所以還需要添加 Druid 相關依賴。

pom.xml 文件中依賴項如下:

實例:

	    <!-- 熱部署 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<!-- web -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- jdbc -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<!-- myql驅動 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- springboot druid -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.22</version>
		</dependency>

3.4 構建商品類和商品數據訪問類

spring-boot-hikari 項目一致。

3.5 配置數據源信息

通過配置文件,設置數據源信息。由于我們不再使用默認數據源,所以此處需要指定數據源類型為 DruidDataSource 。

實例:

# 指定數據源類型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 配置數據庫驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置數據庫url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
# 配置數據庫用戶名
spring.datasource.username=root
# 配置數據庫密碼
spring.datasource.password=Easy@0122

3.6 測試

測試類代碼同 spring-boot-hikari 一致,運行測試類后,結果如下:

use time:1428ms
com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper

4. 對比結果分析

其實只能得出一個結論,在某些場景下 Druid 的速度不比 Hikari 慢,甚至還略勝一籌。

當然我們只是對兩種數據源的默認配置、單一線程情況進行了簡單測試,大家感興趣的話可以研究兩種數據源的配置方式,然后通過多線程進行全面測試。

5. Druid 監控

看到這個結果,大家可能對本篇文章不滿了,說了半天,也沒看出 Druid 好在哪兒啊,為啥還費勁將默認的 Hikari 更換掉呢。

不要著急,我們仔細看下官方介紹:
圖片描述

Druid 在阿里巴巴開源項目官網的描述

可以看到, Druid 是為監控而生,說明 Druid 最強大的功能實際上是監控,接下來我們就演示下如何實現 Druid 監控。

添加監控相關的配置類,需要注意的是我們設定了監控功能的賬號和密碼。

實例:

/**
 * Druid配置
 */
@Configuration
public class DruidConfig {
	/**
	 * 注冊servletRegistrationBean
	 */
	@Bean
	public ServletRegistrationBean servletRegistrationBean() {
		ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),
				"/druid/*");
		servletRegistrationBean.addInitParameter("allow", "");
		// 賬號密碼
		servletRegistrationBean.addInitParameter("loginUsername", "imooc");
		servletRegistrationBean.addInitParameter("loginPassword", "123456");
		servletRegistrationBean.addInitParameter("resetEnable", "true");
		return servletRegistrationBean;
	}

	/**
	 * 注冊filterRegistrationBean
	 */
	@Bean
	public FilterRegistrationBean filterRegistrationBean() {
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
		// 添加過濾規則.
		filterRegistrationBean.addUrlPatterns("/*");
		filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
		return filterRegistrationBean;
	}
}

此時打開網址 http://127.0.0.1:8080/druid 即可顯示 Druid 登錄頁面:

圖片描述

Druid 登錄頁面

我們使用指定的用戶名 imooc 密碼 123456 登錄后,即可查看各類監控信息,內容還是非常全面的,此處就不再展開介紹了。

圖片描述

Druid 監控頁面

6. 小結

在實際研發與生產測試過程中,使用 Druid 的情況還是非常多的, Druid 非常穩定、性能也表現相當優異,更重要的是它提供了全面直觀的監控手段,所以現階段還是推薦大家使用 Druid 。