中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

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

shardingsphere已經很方便的被springboot集成了,你只要引入sharding-jdbc-spring-boot-starter這個(ge)包就可以了,而如果(guo)是原(yuan)生java的(de)話,你就需(xu)要(yao)(yao)自己去實現了,主(zhu)要(yao)(yao)是重(zhong)新定義(yi)數據源,定義(yi)規則等問(wen)題,本(ben)文主(zhu)要(yao)(yao)介紹原(yuan)生環境(jing)下(xia)的(de)shardingsphere的(de)使用。

依賴引用

<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>

添加persistence.xml配置文件

  • 在resources/META-INF下面添加persistence.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
             xmlns="//xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="//xmlns.jcp.org/xml/ns/persistence //xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="lindDb">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://192.168.x.x:3306/sharding0"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="xxx"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

建立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這張數據表里。

注意:當采用分(fen)表(biao)規則之后,如(ru)(ru)果(guo)你(ni)的(de)記(ji)錄(lu)主鍵沒(mei)有按著規則存(cun)(cun)儲,是無法獲(huo)取到時數據(ju)的(de),如(ru)(ru)order_id為(wei)1的(de)記(ji)錄(lu)被存(cun)(cun)儲到了t_order_0里,那這條數據(ju)將無法被找到。

posted @ 2024-01-16 16:22  張占嶺  閱讀(320)  評論(0)    收藏  舉報