1. 程式人生 > >Spring boot項目集成Sharding Jdbc

Spring boot項目集成Sharding Jdbc

true over 讀寫分離 .com 大小 auto eal eve ever

  環境
  
  jdk:1.8
  
  framework: spring boot, sharding jdbc
  
  database: MySQL
  
  搭建步驟
  
  在pom 中加入sharding 依賴
  
  <dependency>
  
  <groupId>io.shardingjdbc</groupId>
  
  <artifactId>sharding-jdbc-core-spring-boot-starter</artifactId>
  
  <version>2.0.3</version>
  
  </dependency>
  
  將原來的 spring DataSource 註釋掉,加入 sharding 的配置
  
  sharding:
  
  jdbc:
  
  datasource:
  
  names: ds_0,ds_1
  
  ds_0:
  
  type: com.zaxxer.hikari.HikariDataSource
  
  driver-class-name: com.mysql.jdbc.Driver
  
  jdbc-url: jdbc:mysql://sharding0
  
  username: mams_test
  
  password: mams_test
  
  ds_1:
  
  type: com.zaxxer.hikari.HikariDataSource
  
  driver-class-name: com.mysql.jdbc.Driver
  
  jdbc-url: jdbc:mysql://sharding1
  
  username: mams_test
  
  password: mams_test
  
  config:
  
  sharding:
  
  default-data-source-name: ds_0
  
  tables:
  
  task:
  
  actual-data-nodes: ds_${0..1}.task
  
  database-strategy:
  
  inline:
  
  sharding-column: id
  
  algorithm-expression: ds_${id % 2}
  
  key-generator-column-name: id
  
  reverse_display:
  
  actual-data-nodes: ds_${0..1}.reverse_display
  
  database-strategy:
  
  inline:
  
  sharding-column: task_id
  
  algorithm-expression: ds_${task_id % 2}
  
  key-generator-column-name: id
  
  props:
  
  sql.show: true
  
  註:
  
  這個配置只是針對分庫,sharding jdbc 還支持讀寫分離,主從等模式,具體可以看文檔sharding jdbc configuration
  
  faq
  
  只有網友的分享例子,沒有文檔
  
  sharding jdbc 的鏈接 shardingjdbc.io 訪問是不可用的,在碼雲上找到了一份文檔,地址是sharding-jdbc-doc
  
  spring boot的 health check 顯示為down
  
  看了一下 DataSourceHealthIndicator 類的實現,要求 select 1 返回的大小為 1才認為數據庫是健康的,但是經過分庫之後,這個list size 應該了是數據庫的數量,所以顯示數據庫為down。
  
  可以將db 個health check關掉,配置management.health.db.enabled=false 即可。
  
  不過這種情況下數據庫如果掛掉的話註冊中心是不知道的,需要定制一個自己的數據庫檢查類
  
  @Component
  
  public class CustomDataSourceHealthCheck extends AbstractHealthIndicator {
  
  private JdbcTemplate jdbcTemplate;
  
  private String databases;
  
  private int databaseCount;
  
  private String query www.tiaotiaoylzc.com= "SELECT 1 ";
  
  @PostConstruct
  
  public void init() {
  
  databaseCount = databases.split(",").length;
  
  }
  
  @Override
  
  protected void doHealthCheck(Health.Builder builder) throws Exception {
  
  try {
  
  List<Map<String, Object>> result = jdbcTemplate.queryForList(query);
  
  if (result.size(www.mytxyl1.com) == databaseCount) {
  
  builder.up();
  
  } else {
  
  builder.down();
  
  }
  
  } catch (Exception e) {
  
  builder.down(e);
  
  }
  
  }
  
  public JdbcTemplate getJdbcTemplate() {
  
  return jdbcTemplate;
  
  }
  
  @Autowired
  
  public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  
  this.jdbcTemplate = jdbcTemplate;
  
  }
  
  public String getDatabases() {
  
  return databases;
  
  }
  
  @Value("${sharding.www.yongshi123.cn jdbc.datasource.names}")
  
  public void setDatabases(String databases) {
  
  this.databases = databases;
  
  }
  
  public int getDatabaseCount() {
  
  return databaseCount;
  
  }
  
  public void setDatabaseCount(int databaseCount) {
  
  this.databaseCount = www.zhenghongyule.com/ databaseCount;
  
  }
  
  public String getQuery(www.xtd912.com) {
  
  return query;
  
  }
  
  public void setQuery(String query) {
  
  this.query = query;
  
  }
  
  }

Spring boot項目集成Sharding Jdbc