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

这篇具有很好参考价值的文章主要介绍了springboot~shardingsphere在非spring框架中的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

shardingsphere已经很方便的被springboot集成了,你只要引入sharding-jdbc-spring-boot-starter这个包就可以了,而如果是原生java的话,你就需要自己去实现了,主要是重新定义数据源,定义规则等问题,本文主要介绍原生环境下的shardingsphere的使用。

依赖引用

<dependencies>
        <!-- mysql 数据源 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

        <!-- HikariCP连接池 -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>4.0.3</version>
        </dependency>

        <!-- shardingsphere分库分表 -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-core</artifactId>
            <version>4.1.1</version> <!-- 替换成最新版本 -->
        </dependency>

        <!-- ORM -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.15.Final</version>
        </dependency>

        <!-- 生产力工具 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
    </dependencies>

建立DataSource数据源

  • 添加了数据源,确定了mysql数据库,支持同时设置多个数据源
  • 定义了分库分表的规则
  public static DataSource createDataSource() throws SQLException {
    // 配置真实数据源
    Map<String, DataSource> dataSourceMap = new HashMap<>();
    // 配置第一个 MySQL 数据源
    HikariDataSource ds0 = new HikariDataSource();
    ds0.setDriverClassName("com.mysql.jdbc.Driver");
    ds0.setJdbcUrl("jdbc:mysql://192.168.xx.xx:3306/sharding0");
    ds0.setUsername("root");
    ds0.setPassword("123456");
    dataSourceMap.put("ds0", ds0);

    // 配置分片规则
    TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration("t_order", "ds0.t_order_${0..2}");
    ShardingStrategyConfiguration shardingStrategyConfiguration = new StandardShardingStrategyConfiguration("order_id", new ModuloShardingAlgorithm());
    tableRuleConfig.setTableShardingStrategyConfig(shardingStrategyConfiguration);

    ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
    shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig);

    // 创建 ShardingSphere 数据源
    return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());
}

建立分表规则

/**
 * 分表算法
 */
public class ModuloShardingAlgorithm implements PreciseShardingAlgorithm<Long> {

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        for (String each : availableTargetNames) {
            if (each.endsWith(String.valueOf(shardingValue.getValue() % 2))) {
                return each;
            }
        }
        throw new UnsupportedOperationException();
    }
}

源生SQL方式读取数据

static void select() throws SQLException {
    // 创建数据源
    DataSource dataSource = createDataSource();

    // 执行SQL
    try (Connection conn = dataSource.getConnection()) {
        String sql = "SELECT * FROM t_order WHERE order_id = ?";
        try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
            preparedStatement.setLong(1, 11L);
            try (ResultSet resultSet = preparedStatement.executeQuery()) {
                while (resultSet.next()) {
                    System.out.println(resultSet.getString("order_id"));
                }
            }
        }
    }
}

Hibernate方式,写入,读取数据

定义实体

@Entity
@Data
@Table(name = "t_order")
@NamedQueries({
        @NamedQuery(
                name = "findById",
                query = "FROM Order t WHERE t.orderId = :orderId"
        )
})
public class Order {
    @Id
    @Column(name = "order_id", nullable = false)
    private Long orderId;
    @Column(name = "user_id", nullable = false)
    private Long userId;
    @Column(name = "amount", nullable = false)
    private Double amount;
}

定义数据仓库

public class OrderRepository {
    // 创建EntityManagerFactory
    EntityManagerFactory entityManagerFactory;

    // 创建EntityManager
    EntityManager entityManager;

    public OrderRepository() throws SQLException {
        this.entityManagerFactory = Persistence.createEntityManagerFactory("lindDb", getProperties(Main.createDataSource()));
        this.entityManager = entityManagerFactory.createEntityManager();
    }

    private static Map<String, Object> getProperties(DataSource dataSource) {
        Map<String, Object> properties = new HashMap<>();
        properties.put("javax.persistence.nonJtaDataSource", dataSource);
        return properties;
    }

    public List<Order> findById(Long id) {
        return entityManager.createQuery("findById", Order.class).setParameter("orderId", id).getResultList();
    }

    public void save(Order order) {
        entityManager.getTransaction().begin();
        entityManager.persist(order);
        entityManager.getTransaction().commit();
        entityManager.close();
        entityManagerFactory.close();
    }
}

定义添加逻辑及测试

static void HihernateInsert() throws SQLException {
    OrderRepository orderRepository = new OrderRepository();
    Order order = new Order();
    order.setAmount(100d);
    order.setOrderId(11L);
    order.setUserId(6L);
    orderRepository.save(order);
}

根据分表的规则,这条数据会被写到t_order_1这张数据表里。

注意:当采用分表规则之后,如果你的记录主键没有按着规则存储,是无法获取到时数据的,如order_id为1的记录被存储到了t_order_0里,那这条数据将无法被找到。文章来源地址https://www.toymoban.com/news/detail-794565.html

到了这里,关于springboot~shardingsphere在非spring框架中的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring框架常见注解(Spring、Springboot、Springmvc)

    注解 说明 @Component、@Controller、@Service、@Repository 使用在类上用于实例化Bean @Autowired 使用在字段上用于根据类型依赖注入 @Qualifier 结合@Autowired一起使用用于根据名称进行依赖注入 @Scope 标注Bean的作用范围 @Configuration 指定当前类是一个 Spring 配置类,当创建容器时会从该类上

    2024年02月15日
    浏览(53)
  • SpringBoot——Spring Security 框架

    优质博文:IT-BLOG-CN Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC , DI (控制反转 Inversion of Control , DI : Dependency Injection 依赖注入)和 AOP (面

    2024年02月04日
    浏览(37)
  • [SpringBoot]Spring Security框架

    目录 关于Spring Security框架 Spring Security框架的依赖项 Spring Security框架的典型特征  关于Spring Security的配置 关于默认的登录页 关于请求的授权访问(访问控制)  使用自定义的账号登录 使用数据库中的账号登录 关于密码编码器 使用BCrypt算法 关于伪造的跨域攻击 使用前后端分

    2024年02月08日
    浏览(39)
  • SpringBoot 整合 ShardingSphere4.1.1实现分库分表

    目录 前言 一、ShardingSphere4.1.1的spring boot配置 二、ShardingSphere的分片策略 三、SpringBoot 整合 ShardingSphere4.1.1 四 、ShardingSphere实现分布式事务控制     ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这

    2024年02月08日
    浏览(40)
  • shardingsphere5.x整合springboot分库分表实战

    官方文档不同版本配置变更记录:Spring Boot Start 配置 :: ShardingSphere pom.xml配置: 建表sql: yml配置: orders对象实体: OrdersMapper:  OrdersMapper.xml:  单元测试:  1、插入数据结果,按order_no分片取模,分片数为10,该数据被写入表orders_2: 2、查询数据sql,按order_no分片取模,分

    2024年02月07日
    浏览(42)
  • Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46

    在前面我们通过以下章节对 ShardingSphere 的 AutoTable 有了基础的了解: Spring Boot集成ShardingSphere分片利器 AutoTable (一)—— 简单体验 | Spring Cloud 45 书接上回,本章进行对 AutoTable 支持的自动分片算法进行逐一示例说明。 示例采用 springboot 集成 shardingsphere-jdbc 方式搭建。 shadi

    2024年02月10日
    浏览(41)
  • Spring框架中的Bean

    在Spring框架中,Bean是指一个由Spring容器管理的对象。这个对象可以是任何一个Java类的实例,例如数据库连接、业务逻辑类、控制器等等。Bean实例的创建和管理是由Spring容器负责的,而不是由应用程序本身负责。 Bean的主要优势是可以将对象的创建和管理与业务逻辑分离。这

    2023年04月09日
    浏览(33)
  • 【Spring框架全系列】SpringBoot配置日志文件

    🍧🍧哈喽,大家好,我是小浪。那么上篇博客我们学习了SpringBoot配置文件的相关操作,本篇博客我们将学习一个新的知识点,SpringBoot日志文件。🖥🖥 📲目录 一、日志是什么,有什么作用? 二、如何看到日志文件? 三、如何自定义日志打印 1、在程序中得到⽇志对象 2、使

    2024年02月03日
    浏览(68)
  • Spring框架中的@Conditional系列注解

    Conditional 是由SpringFramework提供的一个注解,位于 org.springframework.context.annotation 包内,定义如下。 SpringBoot 模块大量的使用@Conditional 注释,我们可以将Spring的@Conditional注解用于以下场景: 可以作为类级别的注解直接或者间接的与@Component相关联,包括@Configuration类; 可以作为元

    2024年02月08日
    浏览(40)
  • 【SpringBoot篇】Spring_Task定时任务框架

    Spring Task 是 Spring 框架提供的一种任务调度和异步处理的解决方案。 可以按照约定的时间自动执行某个代码逻辑 它可以帮助开发者在 Spring 应用中轻松地实现定时任务、异步任务等功能,提高应用的效率和可维护性。 Spring Task 的主要特点包括: 简单易用:Spring Task 提供了简

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包