真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

ShardingJDBC如何分庫分表?看完你就會了

Sharding JDBC的操作分為配置使用、讀寫分離、分庫分表以及應用等,今天我們主要來了解一下關于分庫分表的操作,如果你對此感興趣的話,那我們就開始吧。
環(huán)境準備
pom.xml

org.springframework.boot
spring-boot-starter-parent
2.1.3.RELEASE


1.8
3.1.0



io.shardingsphere
sharding-jdbc-core
${sharding.version}

創(chuàng)新互聯(lián)長期為近千家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為隆化企業(yè)提供專業(yè)的做網站、成都做網站,隆化網站改版等技術服務。擁有10年豐富建站經驗和眾多成功案例,為您定制開發(fā)。


    io.shardingsphere
    sharding-jdbc-spring-boot-starter
    ${sharding.version}



    com.alibaba
    druid
    1.1.10



    org.mybatis
    mybatis
    3.4.5



    org.mybatis.spring.boot
    mybatis-spring-boot-starter
    1.3.1



    MySQL
    mysql-connector-java
    5.1.46



    org.springframework.boot
    spring-boot-starter



    org.projectlombok
    lombok



    org.springframework.boot
    spring-boot-starter-test
    test




org.springframework.boot
spring-boot-maven-plugin


domain
// 建立domain@Setter@Getter@ToString@NoArgsConstructor@AllArgsConstructorpublic class Employee {
private Long id;
private String name;}
配置類
@SpringBootApplication@MapperScan("cn.wolfcode.sharding.mapper")public class ShardingApplication { }
分庫分表
案例模型
把數(shù)據分別存放在兩臺服務器的兩個數(shù)據庫中表,通過分片算法來決定當前的數(shù)據存放在哪個數(shù)據庫的哪個表中,由于一個連接池只能連接一個特定的數(shù)據庫,所以這里需要創(chuàng)建多個連接池對象
建表
-- 分別在2臺服務器中建立數(shù)據庫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.names=db0,db1

格式sharding.jdbc.datasource.連接池名.xxx:設置4要素信息

sharding.jdbc.datasource.db0.type=com.alibaba.druid.pool.DruidDataSource
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.type=com.alibaba.druid.pool.DruidDataSource
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

設置分庫規(guī)則

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.sharding-column=id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=db$->{id % 2}

綁定邏輯表

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

設置分表規(guī)則

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.actual-data-nodes=db$->{0..1}.employee$->{0..1}
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

打印日志

sharding.jdbc.config.props.sql.show=true
mapper
/**

  • 這里寫的employee表是上面所配置的邏輯表
  • 底層會根據分片規(guī)則,把我們寫的邏輯表改寫為數(shù)據庫中的真實表
    /@Mapperpublic interface EmployeeMapper {
    @Select("select
    from employee")
    List selectAll();

    @Insert("insert into employee (name) values (#{name})")
    void inser(Employee entity);}
    測試
    @RunWith(SpringRunner.class)@SpringBootTest(classes=ShardingApplication.class)public class ShardingApplicationTests {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Test
    public void save() {
    for (int i = 0; i < 10; i++) {
    Employee employee = new Employee();
    employee.setName("xx"+i);
    employeeMapper.inser(employee);
    }
    }

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

看完這些操作后不妨自己去試試,實踐才能檢驗真知,如果遇到了問題,也可以及時向我詢問,我也會盡我所力幫助你。


網站標題:ShardingJDBC如何分庫分表?看完你就會了
分享網址:http://weahome.cn/article/gohigc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部