sharding-jdbc主要為了簡化大數據量要做分庫分表,自己要寫分庫分表代碼的一個框架,當然這個框架功能非常強大,還支持讀寫分離,簡單配置即可使用,注意這個為java定制化框架,當然其他語言想要用可以用mycat或者sharding-proxy。官方資料:https://shardingsphere.apache.org/document/current/cn/overview/
用之前需要了解幾個基本概念
邏輯表
水平拆分的數據庫(表)的相同邏輯和數據結構表的總稱。例:訂單數據根據主鍵尾數拆分為10張表,分別是t_order_0
到t_order_9
,他們的邏輯表名為t_order
。
真實表
在分片的數據庫中真實存在的物理表。即上個示例中的t_order_0
到t_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配置