sharding-jdbc介绍
引入依赖 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 <dependencies > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > </dependency > <dependency > <groupId > org.mybatis.spring.boot</groupId > <artifactId > mybatis-spring-boot-starter</artifactId > <version > 2.0.1</version > </dependency > <dependency > <groupId > com.alibaba</groupId > <artifactId > druid</artifactId > <version > 1.1.14</version > </dependency > <dependency > <groupId > org.apache.shardingsphere</groupId > <artifactId > sharding-jdbc-spring-boot-starter</artifactId > <version > 4.0.0</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <scope > runtime</scope > </dependency > </dependencies >
数据分片 配置 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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 spring: shardingsphere: datasource: names: ds0, ds1 ds0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.211.128:3306/sharding-jdbc?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: root ds1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.211.129:3306/sharding-jdbc?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: root sharding: tables: t_order: actual-data-nodes: ds$->{0..1}.t_order$->{0..1} key-generator: column: order_id type: SNOWFLAKE props: worker.id = 1 table-strategy: inline: sharding-column: order_id algorithm-expression: t_order$->{order_id % 2 } database-strategy: inline: sharding-column: user_id algorithm-expression: ds$->{user_id % 2 } t_order_item: actual-data-nodes: ds$->{0..1}.t_order_item$->{0..1} key-generator: column: order_item_id type: SNOWFLAKE props: worker.id = 1 table-strategy: inline: sharding-column: order_id algorithm-expression: t_order_item$->{order_id % 2 } database-strategy: inline: sharding-column: user_id algorithm-expression: ds$->{user_id % 2 } t_dict: key-generator: column: id type: SNOWFLAKE props: worker.id = 1 binding-tables: - t_order, t_order_item broadcast-tables: t_dict props: sql.show: true logging: level: root: error ShardingSphere-SQL: info
分片测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public interface OrderDAO { @Insert("insert into t_order(user_id, product_name) values(#{userId}, #{productName})") @Options(useGeneratedKeys = true, keyProperty = "orderId") int insertOrder (Order order) ; @Insert("insert into t_order_item(order_id, create_time, user_id) values(#{orderId}, #{createTime}, #{userId})") int insertOrderItem (OrderItem item) ; @Select("select * from t_order as o left join t_order_item as item on o.order_id = item.order_id order by o.order_id desc") List<Map> selectAll () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Transactional public void addOrder () { for (int i = 0 ; i < 10 ; i++) { Long userId = 1L ; if (i % 2 == 0 ) { userId = 2L ; } Order order = new Order (); order.setProductName("test" ); order.setUserId(userId); orderDAO.insertOrder(order); OrderItem item = new OrderItem (); item.setUserId(userId); item.setOrderId(order.getOrderId()); item.setCreateTime(new Date ()); orderDAO.insertOrderItem(item); } }
控制台日志
//逻辑sql Logic SQL: insert into t_order(user_id, product_name) values(?, ?) //实际执行的sql, ds0为数据源名称 Actual SQL: ds0 ::: insert into t_order0(user_id, product_name, order_id) values(?, ?, ?) ::: [2, test, 447816871484329984] Logic SQL: insert into t_order_item(order_id, create_time, user_id) values(?, ?, ?) Actual SQL: ds0 ::: insert into t_order_item0(order_id, create_time, user_id, order_item_id) values(?, ?, ?, ?) ::: [447816871484329984, 2020-03-20 17:44:22.352, 2, 447816872205750272]
公共表和其他测试查看日志即可
读写分离 读写分离需要先配置mysql主从同步
配置 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 spring: shardingsphere: datasource: names: master, slave master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.211.128:3306/sharding-jdbc?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: root slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.211.130:3306/sharding-jdbc?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: root sharding: master-slave-rules: ds0: master-data-source-name: master slave-data-source-names: slave tables: t_order: actual-data-nodes: ds0.t_order$->{0..1} key-generator: column: order_id type: SNOWFLAKE props: worker.id = 1 table-strategy: inline: sharding-column: order_id algorithm-expression: t_order$->{order_id % 2 } t_order_item: actual-data-nodes: ds0.t_order_item$->{0..1} key-generator: column: order_item_id type: SNOWFLAKE props: worker.id = 1 table-strategy: inline: sharding-column: order_id algorithm-expression: t_order_item$->{order_id % 2 } props: sql.show: true logging: level: root: error ShardingSphere-SQL: info
由于表结构未改变,直接运行分片中的测试 修改操作全部使用master数据源 查询操作全部使用slave数据源