SpringBoot+HikariCP+beetlsql高性能組合優雅的實現多數據源並分頁


大家都在用jpa、mybatis做數據庫鏈接,這里分享一個更加出色的高性能組合。

我們使用 https://start.spring.io/ 生成基礎工程,選擇必要的組件進行下載。

1-project-init

HikariCP

選擇一個好的數據庫連接池對數據庫訪問至關重要,Spring Boot 自帶 HikariCP 數據庫連接池,並推薦優先使用 HikariCP。從下圖可以驗證 Spring Boot 默認支持。

2-HikariCP-Springboot-default

安裝HikariCP

Java 8 thru 11 maven artifact:

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>3.4.3</version>
    </dependency>

Java 7 maven artifact (maintenance mode):

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java7</artifactId>
        <version>2.4.13</version>
    </dependency>

Java 6 maven artifact (maintenance mode):

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java6</artifactId>
        <version>2.3.13</version>
    </dependency>

BeetlSQL

BeetSql是一個全功能DAO工具, 同時具有Hibernate 優點 & Mybatis優點功能,適用於承認以SQL為中心,同時又需求工具能自動能生成大量常用的SQL的應用。下圖從不通緯度對常用ORM框架進行了對比。

3-beetlsql-nb

安裝

maven 方式:

<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetlsql</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
  <groupId>com.ibeetl</groupId>
  <artifactId>beetl</artifactId>
  <version>${最新版本}</version>
</dependency>

官網介紹 http://ibeetl.com/guide/#/beetlsql/

准備工作

創建庫表結構

使用下面語句創建數據庫和表結構

CREATE DATABASE first;
USE first;
CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(64) DEFAULT NULL,
	  `email` varchar(64) DEFAULT NULL,
      `age` int(4) DEFAULT NULL,
      `create_date` datetime NULL DEFAULT NULL,
	  `update_date` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE DATABASE second;
USE second;
CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(64) DEFAULT NULL,
	  `email` varchar(64) DEFAULT NULL,
      `age` int(4) DEFAULT NULL,
      `create_date` datetime NULL DEFAULT NULL,
	  `update_date` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

安裝必要依賴

<dependency>
	<groupId>com.ibeetl</groupId>
	<artifactId>beetlsql</artifactId>
	<version>2.12.28.RELEASE</version>
</dependency>
<dependency>
	<groupId>com.ibeetl</groupId>
	<artifactId>beetl</artifactId>
	<version>3.1.3.RELEASE</version>
</dependency>

多數據源配置

我們采用 Spring 官網推薦的方式進行

@Configuration
public class DataSourceConfig {
	@Bean
	@Primary
	@ConfigurationProperties("app.datasource.first")
	public DataSourceProperties firstDataSourceProperties() {
		return new DataSourceProperties();
	}

	@Bean
	@Primary
	@ConfigurationProperties("app.datasource.first.configuration")
	public HikariDataSource firstDataSource() {
		return firstDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
	}

	@Bean
	@ConfigurationProperties("app.datasource.second")
	public DataSourceProperties secondDataSourceProperties() {
		return new DataSourceProperties();
	}

	@Bean
	@ConfigurationProperties("app.datasource.second.configuration")
	public HikariDataSource secondDataSource() {
		return secondDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
	}
	@Bean
	public BeetlSqlDataSource beetlSqlDataSource(@Qualifier("firstDataSource") DataSource firstDataSource,
			@Qualifier("secondDataSource") DataSource secondDataSource) {
		BeetlSqlDataSource source = new BeetlSqlDataSource();
		source.setMasterSource(firstDataSource);
		source.setSlaves(new DataSource[]{secondDataSource});
		return source;
	}
}

application.properties 配置如下

app.datasource.first.url=jdbc:mysql://localhost:3306/first?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&useInformationSchema=true&allowPublicKeyRetrieval=true
app.datasource.first.username=root
app.datasource.first.password=root

app.datasource.first.configuration.minimum-idle=10
app.datasource.first.configuration.maximum-pool-size=100
app.datasource.first.configuration.connection-timeout=8000
app.datasource.first.configuration.leak-detection-threshold=60000
app.datasource.first.configuration.connection-test-query=SELECT 1

app.datasource.second.url=jdbc:mysql://localhost:3306/second?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&useInformationSchema=true&allowPublicKeyRetrieval=true
app.datasource.second.username=root
app.datasource.second.password=root

app.datasource.second.configuration.minimum-idle=10
app.datasource.second.configuration.maximum-pool-size=100
app.datasource.second.configuration.connection-timeout=8000
app.datasource.second.configuration.leak-detection-threshold=60000
app.datasource.second.configuration.read-only=true

分頁查詢

分頁查詢是我們經常要使用的功能,beetlSql 支持多數據,會自動適配當前數據庫生成分頁語句,在beeltSql中調用limit方法進行分頁。

如果你想直接使用 分頁查詢同時獲得總行數,可以在最后調用page方法,返回一個PageQuery對象。 注意page,與select一樣,放在末尾調用,不能重復調用select,page,update,delete之類的哦 使用方法如下:

LambdaQuery<User> query = userDao.createLambdaQuery();
PageQuery<User> page = query.page(1, 2);
System.out.println(page.getTotalRow());
System.out.println(page.getList());

分頁從沒如此順滑~

userDao 繼承了org.beetl.sql.core.mapper.BaseMapper

功能驗證

我們使用單元測試對功能進行驗證代碼如下

@Test
public void testSaveData() {
	List<User> userList = new ArrayList<>();
	for (int i = 0; i < 100; i++) {
		User u = new User();
		u.setAge(102);
		u.setName("一個程序猿的異常-master-" + i);
		u.setEmail("tankdev@163.com");
		userList.add(u);
	}
	userDao.insertBatch(userList);
}

4-savedata

然后我們查詢 first 庫,數據也正常插入了

5-database

此時我們去 second 查詢發現數據不存在

6-second-zero

我們用腳本在 second 插入數據再次查詢,會發現數據已經存在

7-page

beetl-framework-starter 默認說明

  • beetlsql.sqlPath,默認為/sql, 作為存放sql文件的根目錄,位於/resources/sql目錄下
  • beetlsql.nameConversion: 默認是org.beetl.sql.core.UnderlinedNameConversion,能將下划線分割的數據庫命名風格轉化為java駝峰命名風格,還有常用的DefaultNameConversion,數據庫命名完全和Java命名一直,以及JPA2NameConversion,兼容JPA命名
  • beetl-beetlsql.dev:默認是true,即向控制台輸出執行時候的sql,參數,執行時間,以及執行的位置,每次修改sql文件的時候,自動檢測sql文件修改.
  • beetlsql.daoSuffix:默認為Dao。
  • beetlsql.basePackage:默認為com,此選項配置beetlsql.daoSuffix來自動掃描com包極其子包下的所有以Dao結尾的Mapper類。以本章例子而言,你可以配置“com.bee.sample.ch5.dao”
  • beetlsql.dbStyle :數據庫風格,默認是org.beetl.sql.core.db.MySqlStyle.對應不同的數據庫,其他還有OracleStyle,PostgresStyle,SqlServerStyle,DB2SqlStyle,SQLiteStyle,H2Style

BeetlSQL 功能強大,剩下的功能自己去發現吧

關注公眾號回復 BTS 獲取完整代碼

一個程序猿的異常

關注公眾號回復 BTS 獲取完整代碼

----END---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM