分庫分表之sharding-jdbc簡易入門一


  sharding-jdbc主要為了簡化大數據量要做分庫分表,自己要寫分庫分表代碼的一個框架,當然這個框架功能非常強大,還支持讀寫分離,簡單配置即可使用,注意這個為java定制化框架,當然其他語言想要用可以用mycat或者sharding-proxy。官方資料:https://shardingsphere.apache.org/document/current/cn/overview/

      用之前需要了解幾個基本概念

邏輯表

水平拆分的數據庫(表)的相同邏輯和數據結構表的總稱。例:訂單數據根據主鍵尾數拆分為10張表,分別是t_order_0t_order_9,他們的邏輯表名為t_order

真實表

在分片的數據庫中真實存在的物理表。即上個示例中的t_order_0t_order_9

數據節點

數據分片的最小單元。由數據源名稱和數據表組成,例:ds_0.t_order_0

綁定表

指分片規則一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,則此兩張表互為綁定表關系。綁定表之間的多表關聯查詢不會出現笛卡爾積關聯,關聯查詢效率將大大提升。

廣播表

指所有的分片數據源中都存在的表,表結構和表中的數據在每個數據庫中均完全一致。適用於數據量不大且需要與海量數據的表進行關聯查詢的場景,例如:字典表。

注意:分庫和分表都要配置各自的規則

1.pom文件

<dependency>
                <groupId>io.shardingsphere</groupId>
                <artifactId>sharding-jdbc-core</artifactId>
                <version>3.1.0</version>
            </dependency>

2.加入配置

@Configuration
public class DataSourceConfig {

	@Bean
	public DataSource dataSource(KeyGenerator keyGenerator) {
		// 配置真實數據源

		Map<String, DataSource> dataSourceMap = new HashMap<>(2);

		// 配置第一個數據源

		DruidDataSource dataSource1 = new DruidDataSource();

		dataSource1.setDriverClassName("com.mysql.cj.jdbc.Driver");

		dataSource1.setUrl(
				"jdbc:mysql://xxxxx?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true");

		dataSource1.setUsername("xx");

		dataSource1.setPassword("xxx");
		List<String> connectionInitSqlsList = new ArrayList<>();
		connectionInitSqlsList.add("set names utf8mb4");
		dataSource1.setConnectionInitSqls(connectionInitSqlsList);
		dataSource1.setInitialSize(5);
		dataSource1.setMinIdle(5);
		dataSource1.setMaxActive(20);
		dataSource1.setMaxWait(60000);
		dataSource1.setTimeBetweenEvictionRunsMillis(60000);
		dataSource1.setMinEvictableIdleTimeMillis(300000);
		dataSource1.setTestWhileIdle(true);
		dataSource1.setTestOnBorrow(false);
		dataSource1.setTestOnReturn(false);
		dataSource1.setPoolPreparedStatements(true);

		dataSourceMap.put("ds0", dataSource1);

		// 配置第二個數據源

		DruidDataSource dataSource2 = new DruidDataSource();

		dataSource2.setDriverClassName("com.mysql.cj.jdbc.Driver");

		dataSource2.setUrl(
				"jdbc:mysql://xxx?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true");

		dataSource2.setUsername("xxx");

		dataSource2.setPassword("xxx");
		dataSource2.setConnectionInitSqls(connectionInitSqlsList);
		dataSource2.setInitialSize(5);
		dataSource2.setMinIdle(5);
		dataSource2.setMaxActive(20);
		dataSource2.setMaxWait(60000);
		dataSource2.setTimeBetweenEvictionRunsMillis(60000);
		dataSource2.setMinEvictableIdleTimeMillis(300000);
		dataSource2.setTestWhileIdle(true);
		dataSource2.setTestOnBorrow(false);
		dataSource2.setTestOnReturn(false);
		dataSource2.setPoolPreparedStatements(true);
		dataSourceMap.put("ds1", dataSource2);

		// 配置Order表規則

		TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration();
		//邏輯表
		orderTableRuleConfig.setLogicTable("t_order");
		//實際節點
		orderTableRuleConfig.setActualDataNodes("ds${0..1}.t_order${0..1}");
		//自動id生成對應的conlumn
		orderTableRuleConfig.setKeyGeneratorColumnName("order_id");
		//自動id生成策略
		orderTableRuleConfig.setKeyGenerator(keyGenerator);

		// 配置分庫 策略
		orderTableRuleConfig.setDatabaseShardingStrategyConfig(
				new InlineShardingStrategyConfiguration("order_id", "ds${order_id % 2}"));
		// 配置分表策略
		orderTableRuleConfig.setTableShardingStrategyConfig(
				new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));


		ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
		shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
		// shardingRuleConfig.getBindingTableGroups().add("t_order");
		// 獲取數據源對象
		try {
			return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, Collections.emptyMap(),
					null);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 需要手動配置事務管理器
	 *
	 * @param dataSource
	 * @return
	 */
	@Bean
	public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
		JpaTransactionManager txManager = new JpaTransactionManager();
	    txManager.setEntityManagerFactory(entityManagerFactory);
	    return txManager;
	}

	/**
	 * EntityManagerFactory類似於Hibernate的SessionFactory,mybatis的SqlSessionFactory
	 * 總之,在執行操作之前,我們總要獲取一個EntityManager,這就類似於Hibernate的Session, mybatis的sqlSession.
	 *
	 * @return
	 */
	@Bean
	public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
		LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
		factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
		factory.setPackagesToScan("org.shardingtest");
		factory.setDataSource(dataSource);// 數據源
		return factory;
	}

	@Bean
	public KeyGenerator keyGenerator() {
		//默認雪花算法
		return new DefaultKeyGenerator();
	}
}

 注意我orm使用jpa,你們可以使用其他的orm配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM