俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步!
此笔记主要是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中明确声明。 其他包中的类属于内部实现,可能随时进行调整,请勿直接使用。