SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

Stella981
• 阅读 1081

大家都在用jpa、mybatis做数据库链接,这里分享一个更加出色的高性能组合。

我们使用 https://start.spring.io/ 生成基础工程,选择必要的组件进行下载。

SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

HikariCP

选择一个好的数据库连接池对数据库访问至关重要,Spring Boot 自带 HikariCP 数据库连接池,并推荐优先使用 HikariCP。从下图可以验证 Spring Boot 默认支持。

SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

安装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框架进行了对比。

SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

安装

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&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8&amp;useSSL=false&amp;useInformationSchema=true&amp;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&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8&amp;useSSL=false&amp;useInformationSchema=true&amp;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&lt;&gt;();
    for (int i = 0; i &lt; 100; i++) {
        User u = new User();
        u.setAge(102);
        u.setName("一个程序猿的异常-master-" + i);
        u.setEmail("tankdev@163.com");
        userList.add(u);
    }
    userDao.insertBatch(userList);
}

SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

然后我们查询 first 库,数据也正常插入了

SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

此时我们去 second 查询发现数据不存在

SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

我们用脚本在 second 插入数据再次查询,会发现数据已经存在

SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

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 获取完整代码

SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页

关注公众号回复 BTS 获取完整代码

----END---

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
SpringBoot+HikariCP+beetlsql高性能组合优雅的实现多数据源并分页
大家都在用jpa、mybatis做数据库链接,这里分享一个更加出色的高性能组合。我们使用https://start.spring.io/生成基础工程,选择必要的组件进行下载。!1projectinit(https://tankdev.gitee.io/images/springbootmulti/1projectinit.png
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这