ShardingSphere Raw JDBC 主从示例


总览

    这个示例不结合ORM之类的,直接执行SQL语句。通过写两个简单的文件就可以了,大致的步骤如下:

  • 1.配置Maven依赖
  • 2.配置文件写入相关配置
  • 3.获取DataSource类编写
  • 4.测试

配置Maven依赖

    其主要依赖如下,还有一些spring、mysql的依赖,总的Maven文件链接在这:pom.xml,自定查找添加吧

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.0.0-alpha</version>
</dependency>

application.properties文件写入

    写入主从库的相关配置

# 读写分离 - 数据库框架版本 2.0 ShardingSphere-jdbc 5.0.0-alpha
sharding.jdbc.datasource.names=master,slave0,slave1sharding.jdbc.datasource.ds-master.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds-master.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true\&characterEncoding=utf-8\&useSSL=false&allowPublicKeyRetrieval=true
sharding.jdbc.datasource.ds-master.username=root
sharding.jdbc.datasource.ds-master.password=rootsharding.jdbc.datasource.ds-slave0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds-slave0.url=jdbc:mysql://localhost:3309/test?serverTimezone=UTC&useUnicode=true\&characterEncoding=utf-8\&useSSL=false&allowPublicKeyRetrieval=true
sharding.jdbc.datasource.ds-slave0.username=root
sharding.jdbc.datasource.ds-slave0.password=rootsharding.jdbc.datasource.ds-slave1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds-slave1.url=jdbc:mysql://localhost:3310/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8\&useSSL=false&allowPublicKeyRetrieval=true
sharding.jdbc.datasource.ds-slave1.username=root
sharding.jdbc.datasource.ds-slave1.password=root

ShardingMasterSlaveDataSource编写

    这里默认使用HikariDataSource,思路主要是生成各个主从库的链接,放到Sharding中,代码中也有说明,总体比较简单:

package com.example.demo.shardingsphere.raw.jdbc;import com.zaxxer.hikari.HikariDataSource;
import io.shardingsphere.api.config.MasterSlaveRuleConfiguration;
import io.shardingsphere.shardingjdbc.api.MasterSlaveDataSourceFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.*;/*** @author lw*/
@Slf4j
@Component
public class ShardingMasterSlaveDataSource {private final String DRIVER = ".driver-class-name";private final String URL = ".url";private final String USERNAME = ".username";private final String PASSWORD = ".password";private final String DBS = "sharding.jdbc.datasource.names";@Autowiredprivate Environment environment;DataSource createDataSource() throws SQLException {// 获取数据库列表String[] dbs = Objects.requireNonNull(environment.getProperty(DBS)).split(",");log.info("DBS::" + Arrays.toString(dbs));// 设置主从,约定第一个为主,其他为从MasterSlaveRuleConfiguration configuration = new MasterSlaveRuleConfiguration(dbs[0], dbs[0],Arrays.asList(Arrays.copyOfRange(dbs, 1, dbs.length)));log.info("ShardingMasterSlaveDataSource master :: " + configuration.getMasterDataSourceName());log.info("ShardingMasterSlaveDataSource slave :: " + configuration.getSlaveDataSourceNames());// 设置打印SQL语句,查看主从配置和切换是否成功Properties properties = new Properties();properties.setProperty("sql.show", "true");return MasterSlaveDataSourceFactory.createDataSource(createDataSourceMap(dbs), configuration, new HashMap<>(0),properties);}/*** 返回DataSource列表*/private Map<String, DataSource> createDataSourceMap(String[] dbs) {Map<String, DataSource> result = new HashMap<>(dbs.length);for (String db: dbs) {log.info("Create data source ::" + db);result.put(db, createDataSource("sharding.jdbc.datasource.ds-" + db));}return result;}private DataSource createDataSource(String prefix) {log.info(DRIVER + "::" + environment.getProperty(prefix + DRIVER));log.info(URL + "::" + environment.getProperty(prefix + URL));log.info(USERNAME + "::" + environment.getProperty(prefix + USERNAME));log.info(PASSWORD + "::" + environment.getProperty(prefix + PASSWORD));HikariDataSource dataSource = new HikariDataSource();dataSource.setDriverClassName(environment.getProperty(prefix + DRIVER));dataSource.setJdbcUrl(environment.getProperty(prefix + URL));dataSource.setUsername(environment.getProperty(prefix + USERNAME));dataSource.setPassword(environment.getProperty(prefix + PASSWORD));return dataSource;}
}

测试

    直接生写SQL了,就不结合ORM之类的了,这里是通过日志看出是否生效的,日志大致如下

Sharding-Sphere-SQL                      : Rule Type: master-slave
Sharding-Sphere-SQL                      : SQL: select * from stores limit 5 ::: DataSources: slave0
Sharding-Sphere-SQL                      : Rule Type: master-slave
Sharding-Sphere-SQL                      : SQL: select * from stores limit 5 ::: DataSources: slave1
Sharding-Sphere-SQL                      : Rule Type: master-slave
Sharding-Sphere-SQL                      : SQL: insert into stores (name, description) VALUES ("name103", "description103"); ::: DataSources: master
Sharding-Sphere-SQL                      : Rule Type: master-slave
Sharding-Sphere-SQL                      : SQL: select * from stores limit 5 ::: DataSources: master

    代码如下:

package com.example.demo.shardingsphere.raw.jdbc;import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.transaction.annotation.Transactional;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;@Slf4j
@SpringBootTest
@ExtendWith(SpringExtension.class)
public class ShardingMasterSlaveDataSourceTest {@AutowiredShardingMasterSlaveDataSource shardingMasterSlaveDataSource;/*** 运行后从日志可以看出主从之间的切换和从库负载均衡*/@Test @Transactionalpublic void test() throws SQLException {DataSource dataSource = shardingMasterSlaveDataSource.createDataSource();log.info("ShardingMasterSlaveDataSource info::" + dataSource.getConnection().getMetaData().getURL());Connection conn = dataSource.getConnection();Statement statement = conn.createStatement();String sql = "select * from stores limit 5";statement.execute(sql);statement.execute(sql);sql = "insert into stores (name, description) VALUES (\"name103\", \"description103\");";statement.execute(sql);sql = "select * from stores limit 5";statement.execute(sql);}
}

ShardingSphere Raw JDBC 主从示例相关推荐

  1. ShardingSphere RAW JDBC 分布式事务 Narayana XA 代码示例

    ShardingSphere RAW JDBC 分布式事务 Narayana XA 代码示例 项目工程在:transaction-2pc-narayana-xa-raw-jdbc-example 代码 ...

  2. ShardingSphere RAW JDBC 分布式事务XA 代码示例

    ShardingSphere RAW JDBC 分布式事务XA 代码示例 项目工程在:transaction-2pc-xa-raw-jdbc-example 代码简介     基于ShardingSp ...

  3. jdbc 数据源_Java数据源,JDBC数据源示例

    jdbc 数据源 Java DataSource and JDBC DataSource programming is the way to work with database in our jav ...

  4. rowmapper_Spring Integration Jdbc RowMapper示例

    rowmapper JDBC入站通道适配器的基本功能是执行SQL查询,提取数据并将以Message形式封装的结果集传递到本地通道. 您可以在JDBC入站通道适配器的示例中阅读有关此内容的更多信息. 有 ...

  5. java jdbc gbase_Gbase JDBC 应用示例

    1. 使用 JDBC 创建连接 本示例实现了通过 JDBC 建立数据库链接的功能. package com.gbase.jdbc.simple; import java.sql.Connection; ...

  6. sping jdbc 链接mysql_Spring Boot JDBC 连接数据库示例

    文本将对在spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍. 包括JDBC.JPA.MyBatis.多数据源和事务. JDBC 连接数据库 1.属性配置文件( ...

  7. java原始套接字,raw socket介绍(示例代码)

    原文: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=876233 test 1.原始套接字(raw socket) 1.1 原始 ...

  8. JDBC连接MySQL数据库及示例

    JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  9. Spring JDBC和JdbcTemplate CRUD与DataSource示例

    Spring JDBC示例和JdbcTemplate CRUD与DataSource示例 Spring JDBC是本教程的主题.数据库是大多数企业应用程序不可或缺的一部分.因此,当谈到Java EE框 ...

最新文章

  1. jquery.validate不用submit而用js提交的例子
  2. React ES6组件里绑定this的三种方式
  3. 机器学习(二)Logistic回归(Logistic regression)算法
  4. python适合开发游戏吗_用python能制作游戏吗
  5. java封装概念_Java面向对象----封装概念
  6. Python的pip下载特定版本TensorFlow方法
  7. 老司机 iOS 周报 #67 | 2019-05-13
  8. mybatis plus 使用函数_mybatis-plus的使用 ------ 入门
  9. Manage,管道的简单应用,进程池,队列的简单应用
  10. 【EMV L2】终端风险管理(Terminal Risk Management)
  11. 鸿蒙手机开发者活动,华为 12 月16 日举行鸿蒙 2.0 手机开发者 Beta 活动
  12. 微型计算机及接口技术笔记,2010年自考微型计算机及其接口技术笔记串讲
  13. android电视播放器字幕,android播放视频显示字幕
  14. html640设计稿,为什么写移动端的ui给的640设计稿的宽度,在写html的时候要除以2才正好。...
  15. 同济大学Python程序设计基础 实验七:文件
  16. ol+天地图+geoserver_教程:使用GeoServer发布离线地图服务(WMS)
  17. css中clip:rect用法
  18. 图片损坏打不开如何修复?
  19. AD更改原理图纸大小
  20. 【自学笔记】尚硅谷数据结构与算法Chapter 1 数据结构与算法概述

热门文章

  1. ASP.NET MVC RedirectToRoute类[转]
  2. luasql在Fedora20下的安装与使用示例
  3. Altium Designer中PCB关于Import Changes报错最终解决方案
  4. eclipse打开后显示 Failed to create the part‘s controls 解决方法
  5. [Asp.net MVC]HandleErrorAttribute异常过滤器
  6. 【报告分享】2021年BrandGrow中国新锐品牌增长潜力报告.pdf(附下载链接)
  7. 5-1 File Transfer
  8. TensorFlow图像数据预处理
  9. oracle导出自增设置,oracle008:oracle自增,自适应,数据闪回,导入导出
  10. PHP心脏装置,“人工心脏”不再科幻 “钢铁侠”已成现实