springboot~shardingsphere在非spring框架中的使用

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

shardingsphere已经很方便的被springboot集成了,你只要引入sharding-jdbc-spring-boot-starter这个包就可以了,而如果是原生java的话,你就需要自己去实现了,主要是重新定义数据源,定义规则等问题,本文主要介绍原生环境下的shardingsphere的使用。
依赖引用
  1. <dependencies>
  2.         
  3.         <dependency>
  4.             <groupId>mysql</groupId>
  5.             <artifactId>mysql-connector-java</artifactId>
  6.             <version>8.0.30</version>
  7.         </dependency>
  8.         
  9.         <dependency>
  10.             <groupId>com.zaxxer</groupId>
  11.             <artifactId>HikariCP</artifactId>
  12.             <version>4.0.3</version>
  13.         </dependency>
  14.         
  15.         <dependency>
  16.             <groupId>org.apache.shardingsphere</groupId>
  17.             <artifactId>sharding-jdbc-core</artifactId>
  18.             <version>4.1.1</version>
  19.         </dependency>
  20.         
  21.         <dependency>
  22.             <groupId>org.hibernate</groupId>
  23.             <artifactId>hibernate-core</artifactId>
  24.             <version>5.4.15.Final</version>
  25.         </dependency>
  26.         
  27.         <dependency>
  28.             <groupId>org.projectlombok</groupId>
  29.             <artifactId>lombok</artifactId>
  30.             <version>1.18.12</version>
  31.         </dependency>
  32.         <dependency>
  33.             <groupId>org.slf4j</groupId>
  34.             <artifactId>slf4j-log4j12</artifactId>
  35.             <version>1.7.25</version>
  36.         </dependency>
  37.     </dependencies>
复制代码
建立DataSource数据源


  • 添加了数据源,确定了mysql数据库,支持同时设置多个数据源
  • 定义了分库分表的规则
  1.   public static DataSource createDataSource() throws SQLException {
  2.     // 配置真实数据源
  3.     Map<String, DataSource> dataSourceMap = new HashMap<>();
  4.     // 配置第一个 MySQL 数据源
  5.     HikariDataSource ds0 = new HikariDataSource();
  6.     ds0.setDriverClassName("com.mysql.jdbc.Driver");
  7.     ds0.setJdbcUrl("jdbc:mysql://192.168.xx.xx:3306/sharding0");
  8.     ds0.setUsername("root");
  9.     ds0.setPassword("123456");
  10.     dataSourceMap.put("ds0", ds0);
  11.     // 配置分片规则
  12.     TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration("t_order", "ds0.t_order_${0..2}");
  13.     ShardingStrategyConfiguration shardingStrategyConfiguration = new StandardShardingStrategyConfiguration("order_id", new ModuloShardingAlgorithm());
  14.     tableRuleConfig.setTableShardingStrategyConfig(shardingStrategyConfiguration);
  15.     ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
  16.     shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig);
  17.     // 创建 ShardingSphere 数据源
  18.     return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());
  19. }
复制代码
建立分表规则
  1. /**
  2. * 分表算法
  3. */
  4. public class ModuloShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
  5.     @Override
  6.     public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
  7.         for (String each : availableTargetNames) {
  8.             if (each.endsWith(String.valueOf(shardingValue.getValue() % 2))) {
  9.                 return each;
  10.             }
  11.         }
  12.         throw new UnsupportedOperationException();
  13.     }
  14. }
复制代码
源生SQL方式读取数据
  1. static void select() throws SQLException {
  2.     // 创建数据源
  3.     DataSource dataSource = createDataSource();
  4.     // 执行SQL
  5.     try (Connection conn = dataSource.getConnection()) {
  6.         String sql = "SELECT * FROM t_order WHERE order_id = ?";
  7.         try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
  8.             preparedStatement.setLong(1, 11L);
  9.             try (ResultSet resultSet = preparedStatement.executeQuery()) {
  10.                 while (resultSet.next()) {
  11.                     System.out.println(resultSet.getString("order_id"));
  12.                 }
  13.             }
  14.         }
  15.     }
  16. }
复制代码
Hibernate方式,写入,读取数据

定义实体
  1. @Entity
  2. @Data
  3. @Table(name = "t_order")
  4. @NamedQueries({
  5.         @NamedQuery(
  6.                 name = "findById",
  7.                 query = "FROM Order t WHERE t.orderId = :orderId"
  8.         )
  9. })
  10. public class Order {
  11.     @Id
  12.     @Column(name = "order_id", nullable = false)
  13.     private Long orderId;
  14.     @Column(name = "user_id", nullable = false)
  15.     private Long userId;
  16.     @Column(name = "amount", nullable = false)
  17.     private Double amount;
  18. }
复制代码
定义数据仓库
  1. public class OrderRepository {
  2.     // 创建EntityManagerFactory
  3.     EntityManagerFactory entityManagerFactory;
  4.     // 创建EntityManager
  5.     EntityManager entityManager;
  6.     public OrderRepository() throws SQLException {
  7.         this.entityManagerFactory = Persistence.createEntityManagerFactory("lindDb", getProperties(Main.createDataSource()));
  8.         this.entityManager = entityManagerFactory.createEntityManager();
  9.     }
  10.     private static Map<String, Object> getProperties(DataSource dataSource) {
  11.         Map<String, Object> properties = new HashMap<>();
  12.         properties.put("javax.persistence.nonJtaDataSource", dataSource);
  13.         return properties;
  14.     }
  15.     public List<Order> findById(Long id) {
  16.         return entityManager.createQuery("findById", Order.class).setParameter("orderId", id).getResultList();
  17.     }
  18.     public void save(Order order) {
  19.         entityManager.getTransaction().begin();
  20.         entityManager.persist(order);
  21.         entityManager.getTransaction().commit();
  22.         entityManager.close();
  23.         entityManagerFactory.close();
  24.     }
  25. }
复制代码
定义添加逻辑及测试
  1. static void HihernateInsert() throws SQLException {
  2.     OrderRepository orderRepository = new OrderRepository();
  3.     Order order = new Order();
  4.     order.setAmount(100d);
  5.     order.setOrderId(11L);
  6.     order.setUserId(6L);
  7.     orderRepository.save(order);
  8. }
复制代码
根据分表的规则,这条数据会被写到t_order_1这张数据表里。
注意:当采用分表规则之后,如果你的记录主键没有按着规则存储,是无法获取到时数据的,如order_id为1的记录被存储到了t_order_0里,那这条数据将无法被找到。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表