ShardingSphere是一个开源的分布式数据库中间件,它支持多种关系型数据库,例如MySQL、Oracle、SQL Server等。在本篇博客中,将介绍如何使用Spring Boot 2.7集成ShardingSphere-jdbc5.1.1,并提供相应的配置文件和Java代码演示。
环境准备JDK 1.8+ Maven MySQL数据库 Springboot 2.7.4 ShardingSphere-Jdbc-5.1.1 添加依赖在pom.xml文件中添加以下依赖:
1 2 3 4 5 <dependency > <groupId > org.apache.shardingsphere</groupId > <artifactId > shardingsphere-jdbc-core-spring-boot-starter</artifactId > <version > 5.1.1</version > </dependency >
配置数据源和分片规则在application.yml文件中添加以下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 spring: shardingsphere: mode: type: Memory props: sql-show: true datasource: names: ds0,ds1 ds0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/ds0 username: root password: root ds1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/ds1 username: root password: root rules: sharding: tables: t_user: actual-data-nodes: ds$->{0..1}.t_user$->{0..1} key-generate-strategy: column: id key-generator-name: alg_snowflake database-strategy: standard: sharding-algorithm-name: alg_inline_userid sharding-column: id table-strategy: standard: sharding-algorithm-name: alg_hash_mod sharding-column: id sharding-algorithms: alg_inline_userid: props: algorithm-expression: ds$->{id % 2 } type: INLINE alg_mod: props: sharding-count: 2 type: MOD alg_hash_mod: props: sharding-count: 2 type: HASH_MOD key-generators: alg_snowflake: type: SNOWFLAKE
这里我们配置了两个数据源(ds0和ds1),并且对user表进行了分片,根据id字段对表进行水平分割。具体细节可以参考官方文档 。
Java代码演示在代码中注入ShardingSphere数据源,在使用的时候直接使用即可,和平常的数据源在使用上并无两样。例如 JdbcTemplate:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 @Service public class UserServiceImpl implements UserService { @Autowired private JdbcTemplate jdbcTemplate; @Override public void addUser (User user) { String sql = "INSERT INTO user(name, age) VALUES(?, ?)" ; Object[] params = new Object []{user.getName(), user.getAge()}; jdbcTemplate.update(sql, params); } @Override public List<User> getAllUsers () { String sql = "SELECT id, name, age FROM user" ; return jdbcTemplate.query(sql, new BeanPropertyRowMapper <>(User.class)); } @Override public User getUserById (Long id) { String sql = "SELECT id, name, age FROM user WHERE id=?" ; Object[] params = new Object []{id}; try { return jdbcTemplate.queryForObject(sql, params, new BeanPropertyRowMapper <>(User.class)); } catch (EmptyResultDataAccessException ex) { return null ; } } @Override public void deleteUserById (Long id) { String sql = "DELETE FROM user WHERE id=?" ; Object[] params = new Object []{id}; jdbcTemplate.update(sql, params); } }
我用Springboot3 在和 5.1.1版本整合时出现了数据源注入失败的问题,经过断点调试发现Springboot3在启动时没有加载shardingSphere5.1.1的自动装配类ShardingSphereAutoConfiguration,所以要在Springboot启动类上加上ShardingSphereAutoConfiguration的路径,以便Springboot3启动时加载。如: 1 2 3 4 5 6 7 8 9 10 11 @SpringBootApplication(scanBasePackages = { "love.heer.example.shardingspherejdbc", "org.apache.shardingsphere" // ShardingSphereAutoConfiguration 的源路径 }) public class ShardingSphereJdbcDemoApp { public static void main (String[] args) { SpringApplication.run(ShardingSphereJdbcDemoApp.class, args); } }
Springboot 3+ 最佳整合方式,还是使用最新版本的ShardingSphere来进行整合,新版本的整合方法也进行了调整,详情可见官方文档 。 总结在本篇博客中,介绍了如何使用Spring Boot 2.7集成ShardingSphere-jdbc5.1.1,并提供了相应的配置文件和Java代码演示,配置文件比较重要,配置对应的属性时要细心点 。ShardingSphere是一个非常强大的分布式数据库中间件,可以帮助我们处理高并发的数据访问问题。