中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Sharding JDBC中分庫分表的操作

發布時間:2020-06-18 14:40:42 來源:億速云 閱讀:138 作者:元一 欄目:編程語言

簡介

sharding-jdbc是ShardingSphere的其中一個模塊,定位為輕量級Java框架,在Java的JDBC層提供的額外服務。 它使用客戶端直連數據庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動,完全兼容JDBC和各種ORM框架。

適用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

基于任何第三方的數據庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

支持任意實現JDBC規范的數據庫。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

熟悉sharding JDBC的同學都知道,分庫分表的操作是使用sharding JDBC中非常重要的,可能還有很多初學者對此階段的學習存在疑慮,因此,接下來我會幫助你逐漸深入分庫分表的操作。
環境準備
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version></parent>
<properties>
<java.version>1.8</java.version>
<sharding.version>3.1.0</sharding.version></properties>
<dependencies>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>${sharding.version}</version>
</dependency>

<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>${sharding.version}</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency></dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins></build>
domain
// 建立domain@Setter@Getter@ToString@NoArgsConstructor@AllArgsConstructorpublic class Employee {
private Long id;
private String name;}
配置類
@SpringBootApplication@MapperScan("cn.wolfcode.sharding.mapper")public class ShardingApplication { }
分庫分表
案例模型
把數據分別存放在兩臺服務器的兩個數據庫中表,通過分片算法來決定當前的數據存放在哪個數據庫的哪個表中,由于一個連接池只能連接一個特定的數據庫,所以這里需要創建多個連接池對象
建表
-- 分別在2臺服務器中建立數據庫sharding,并且建表employee_0和employee_1CREATE TABLE employee_0 (
id bigint(20) PRIMARY KEY AUTO_INCREMENT,
name varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ###################################CREATE TABLE employee_1 (
id bigint(20) PRIMARY KEY AUTO_INCREMENT,
name varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
application.properties

定義連接池
格式sharding.jdbc.datasource.連接池名.xxx:設置4要素信息
sharding.jdbc.datasource.db0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.db0.url=jdbc:mysql://db0Ip:port/sharing
sharding.jdbc.datasource.db0.username=xxx
sharding.jdbc.datasource.db0.password=xxx
sharding.jdbc.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.db1.url=jdbc:mysql://db1Ip:port/sharing
sharding.jdbc.datasource.db1.username=xxx
sharding.jdbc.datasource.db1.password=xxx
設置分庫規則
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column:分庫列
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression:分庫算法
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=db$->{id % 2}
綁定邏輯表
設置分表規則
sharding.jdbc.config.sharding.tables.邏輯表.actual-data-nodes:邏輯表對應的真實表
sharding.jdbc.config.sharding.tables.邏輯表.table-strategy.inline.sharding-column:分表列
sharding.jdbc.config.sharding.tables.邏輯表.table-strategy.inline.algorithm-expression:分表算法
sharding.jdbc.config.sharding.tables.邏輯表.key-generator-column-name:主鍵列
sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.algorithm-expression=employee$->{id % 2}
sharding.jdbc.config.sharding.tables.employee.key-generator-column-name=id
打印日志
mapper
/**

  • 這里寫的employee表是上面所配置的邏輯表
/@Mapperpublic interface EmployeeMapper {
@Select("select  from employee")
List<Employee> selectAll();
void inser(Employee entity);}
測試
@RunWith(SpringRunner.class)@SpringBootTest(classes=ShardingApplication.class)public class ShardingApplicationTests {
private EmployeeMapper employeeMapper;
@Test
public void save() {
for (int i = 0; i < 10; i++) {
Employee employee = new Employee();

sharding.jdbc.datasource.names=db0,db1

sharding.jdbc.datasource.db0.type=com.alibaba.druid.pool.DruidDataSource

sharding.jdbc.datasource.db1.type=com.alibaba.druid.pool.DruidDataSource

sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id

sharding.jdbc.config.sharding.binding-tables=employee

sharding.jdbc.config.sharding.tables.employee.actual-data-nodes=db$->{0..1}.employee$->{0..1}

sharding.jdbc.config.props.sql.show=true

  • 底層會根據分片規則,把我們寫的邏輯表改寫為數據庫中的真實表

    @Insert("insert into employee (name) values (#{name})")

    @Autowired

    employee.setName("xx"+i);
    employeeMapper.inser(employee);
    }
    }

    @Test
    public void list() {
    employeeMapper.selectAll().forEach(System.out::println);
    }}
    優缺點
    拆分后單表數據量比較小,單表大數據被拆分,解決了單表大數據訪問問題
    分表以什么切分如果弄的不好,導致多次查詢,而且有時候要跨庫操作,甚至導致join無法使用,對排序分組等有性能影響
    之前的原子操作被拆分成多個操作,事務處理變得復雜
    多個DB維護成本增加

分庫分表的操作并不難學,只是整個shardingJDBC的學習范圍還是比較廣,要學好也并不是那么容易的。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

齐河县| 桦甸市| 濮阳市| 天全县| 龙山县| 赤峰市| 湘潭县| 乌兰察布市| 读书| 什邡市| 东阳市| 阿拉尔市| 福清市| 营山县| 长武县| 博客| 通辽市| 永康市| 乳山市| 衡阳市| 綦江县| 普兰县| 罗江县| 德化县| 和平县| 竹溪县| 商都县| 高陵县| 筠连县| 濮阳市| 当雄县| 乳山市| 松溪县| 冀州市| 遵义市| 虹口区| 宜宾县| 文成县| 揭阳市| 昌吉市| 商都县|