Bootstrap

ShardingJDBC私人学习笔记

俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步!

此笔记主要是antlr4.13版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的地方欢迎大家指正。


一、基础概念:   
    
    1、shardingjdbc 是 ShardingSphere-JDBC,属于Apache ShardingSphere中的一个产品。Apache ShardingSphere是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
      官方网站:https://shardingsphere.apache.org/index_zh.html
      github使用案例:https://github.com/apache/shardingsphere/tree/master/examples
    

    
    2、maven的GAV坐标为:
        5.X.X开始的版本:
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core</artifactId>
            <version>${latest.release.version}</version>
        </dependency>
        
        4.X.X以下的版本:
        <dependency>
          <groupId>org.apache.shardingsphere</groupId>
          <artifactId>sharding-jdbc-spring</artifactId>
          <version>4.1.1</version>
          <type>pom</type>
        </dependency>
        
        
        与SpringBoot整合:
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>3.0.0.M1</version>
        </dependency>
        
    
        
    2、同一线程且同一数据库连接内,如有写入操作,并且有开启事务,以后的读操作均从主库读取,用于保证数据一致性。
       注意如果没开启事务,即使有写入操作,后面的读操作也是在从库读取。


    
    3、shardingjdbc能兼容SpringBoot的声明式事务,不需要做额外处理和配置。如果有增加声明式事务,在多个库之间进行操作时,shardingjdbc也
       自动在多个库之间都增加事务。如果没开启事务,则shardingjdbc也不会开启事务。
 


二、使用笔记:
    1、主要的DataSource工厂类:
        MasterSlaveDataSourceFactory: 读写分离使用的DataSource工厂类
        EncryptDataSourceFactory: 加解密使用的DataSource工厂类
        ShadowDataSourceFactory:影子库(通常压测使用)使用的DataSource工厂类
        ShardingDataSourceFactory:分库分表使用的ShardingDataSourceFactory    
    
    2、配置SQL语句的显示:
        4.X.X版本:sql.show  配置为 true则显示sql,默认为false。
        5.X.X版本:sql-show  配置为 true则显示sql,默认为false。
        

        
    3、参考代码:
   

    @Bean(name = "dataSource")
        @Primary
        public DataSource druidDataSource(@Qualifier(JfappDataSourceConfig.DATA_SOURCE_NAME) DataSource jfDataSource,
                                          @Qualifier(XdDataSourceConfig.DATA_SOURCE_NAME) DataSource xdDataSource) throws SQLException {
            //分库设置
            Map<String, DataSource> dataSourceMap = new HashMap<>(2, 1);
            //添加两个数据库database0和database1
            dataSourceMap.put("ds0-jf", jfDataSource);
            dataSourceMap.put("ds1-xd", xdDataSource);
            List<String> slaveDataSourceNames = new ArrayList<>();
            slaveDataSourceNames.add("ds0-jf");
            MasterSlaveRuleConfiguration config = new MasterSlaveRuleConfiguration("myMasSla", "ds1-xd", slaveDataSourceNames, null);

            Properties properties = new Properties();
            properties.setProperty("sql.show", "true");
            return MasterSlaveDataSourceFactory.createDataSource(dataSourceMap, config, properties);
        }    
        
        
        Bean(name = "transactionManager")
        @Primary
        public DataSourceTransactionManager xdTransactionManager(@Qualifier(ShardingSphereDataSourceConfig.DATA_SOURCE_NAME) DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }


        
        
    4、当需要强制走主库说,可以手动指定:       
 

      HintManager hintManager = HintManager.getInstance() ;
      hintManager.setMasterRouteOnly();


            
        
        
三、注意事项:
    1、配置了某个数据连接池的 spring-boot-starter(比如 druid)和
        shardingsphere-jdbc-spring-boot-starter 时,系统启动会报错,处理方式如下:
        (1)因为数据连接池的 starter(比如 druid)可能会先加载并且其创建一个默认数据源,这将会使得
        ShardingSphere‐JDBC 创建数据源时发生冲突。
        (2)解决办法为,去掉数据连接池的 starter 即可, sharing‐jdbc 自己会创建数据连接池。
        
        
    
    2、使用shardingsphere-jdbc后会有些不支持的功能: 
        DataSource 接口
            • 不支持 timeout 相关操作
        Connection 接口
            • 不支持存储过程,函数,游标的操作 (但是支持在查询语句里使用函数)
            • 不支持执行 native SQL
            • 不支持 savepoint 相关操作
            • 不支持 Schema/Catalog 的操作
            • 不支持自定义类型映射
        Statement 和 PreparedStatement 接口
            • 不支持返回多结果集的语句(即存储过程,非 SELECT 多条数据)
            • 不支持国际化字符的操作
        ResultSet 接口
            • 不支持对于结果集指针位置判断
            • 不支持通过非 next 方法改变结果指针位置
            • 不支持修改结果集内容
            • 不支持获取国际化字符
            • 不支持获取 Array
        JDBC 4.1
            • 不支持 JDBC 4.1 接口新功能
        查询所有未支持方法,请阅读 org.apache.shardingsphere.driver.jdbc.unsupported 包(5.X.X版本)。
        查询所有未支持方法,请阅读org.apache.shardingsphere.shardingjdbc.jdbc.unsupported包(4.X.X版本)。
            
            
    4、使用约定:
        在org.apache.shardingsphere.api和org.apache.shardingsphere.shardingjdbc.api 包中的类是面向用户的API,
        每次修改都会在release notes中明确声明。 其他包中的类属于内部实现,可能随时进行调整,请勿直接使用。
        
        
    
        

;