## 業務主從庫
SQLManager使用數據源,如果只提供一個數據源,則認為讀寫均操作此數據源,如果提供多個,則默認第一個為寫庫,其他為讀庫。用戶在開發代碼的時候,無需關心操作的是哪個數據庫,因為調用SQLMnager 的 select相關api的時候,總是去讀取從庫,add/update/delete 的時候,總是讀取主庫(如下是主從實現原理,大部分情況下無需關心如何實現)
```java
sqlManager.insert(User.class,user) // 操作主庫,如果只配置了一個數據源,則無所謂主從
sqlManager.unique(id,User.class) //讀取從庫
```
主從庫的邏輯是由ConnectionSource來決定的,如下DefaultConnectionSource 的邏輯
```java
@Override
public Connection getConn(ExecuteContext ctx,boolean isUpdate){
if(this.slaves==null||this.slaves.length==0) return this.getWriteConn(ctx);
if(isUpdate) return this.getWriteConn(ctx);
else return this.getReadConn(ctx);
}
```
如果你有一主多從數據源,可以通過ConnectionSourceHelper 構造一個支持主從的ConnectionSource(不同的框架,BeetlSQL提供了不通的構造方式,ConnectionSourceHelper可以作為一個示例使用)
```java
//為了簡單起見,主從庫都走同一個數據庫
DataSource master = SampleHelper.datasource();
DataSource slave1 = SampleHelper.datasource();
DataSource slave2 = SampleHelper.datasource();
//一主二從
ConnectionSource source = ConnectionSourceHelper.getMasterSlave(master,new DataSource[]{slave1,slave2});
SQLManagerBuilder builder = new SQLManagerBuilder(source);
builder.setNc(new UnderlinedNameConversion());
builder.setInters(new Interceptor[]{new DebugInterceptor()});
builder.setDbStyle(new MySqlStyle());
SQLManager sqlManager = builder.build();
```
如果你是Spring或者SpringBoot框架,則可以簡單指定多個數據源,以SpringBoot為例子
```properties
beetlsql = sqlManager1
beetlsql.sqlManager1.ds=ds1,salve1,salve2
beetlsql.sqlManager1.basePackage=org.beetl.sql.springboot.simple
```
這里ds1和slave1,slave2 是數據源的名稱。
如果是Spring,配置如下:
```xml
<bean id="sqlManagerFactoryBean" class="org.beetl.sql.ext.spring.SqlManagerFactoryBean">
<property name="cs" >
<bean class="org.beetl.sql.ext.spring.SpringConnectionSource">
<property name="masterSource" ref="dataSource-master"></property>
<property name="slaveSource">
<list>
<ref bean="dataSource-slave-1"></ref>
<ref bean="dataSource-slave-2"></ref>
</list>
</property>
</bean>
</property>
<!-- 其他配置 -->
</bean>
```
對于不同的ConnectionSource 完成邏輯不一樣,對于spring,jfinal這樣的框架,如果sqlManager在事務環境里,總是操作主數據庫,無論是否是讀寫操作,考慮到主從復制的延遲,這樣有利于保持數據一致性。如果是只讀事務環境 則才會操作從數據庫。如果沒有事務環境,則根據sql是查詢還是更新來決定。
如下是SpringConnectionSource 提供的主從邏輯
```java
@Override
public Connection getConn(ExecuteContext ctx, boolean isUpdate){
if (this.slaves == null || this.slaves.length == 0)
return this.getWriteConn(ctx);
//如果是更新語句,也得走master
if (isUpdate){
return this.getWriteConn(ctx);
}
//在事物里都用master,除了readonly事物
boolean inTrans = TransactionSynchronizationManager.isActualTransactionActive();
if (inTrans) {
boolean isReadOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly();
if (!isReadOnly) {
return this.getWriteConn(ctx);
}
}
return this.getReadConn(ctx);
}
```
注意,對于使用者來說,無需關心上面說的細節,僅供要定制主從邏輯的架構師
> 1) 開發者可以自定義ConnectionSource來完成主從邏輯,
>
> 2)如果想強制某個操作從庫,可以使用sqlManager.forceDataSource方法.
- BeetlSQL 3 指南
- 數據訪問框架
- 適合用戶
- 編譯源碼
- 直接看代碼
- 閑大賦介紹
- BeetlSQL3 特點
- 數據庫訪問工具的痛點
- BeetlSQL3 例子
- 基礎例子
- 結果集映射
- 翻頁查詢
- 演示like,batchUpdate,in 操作
- 自動fetch
- 多數據庫
- 代碼生成框架
- 安裝BeetlSQL
- 直接安裝
- 框架集成
- 編譯源碼
- 快速開始
- 環境準備
- 環境搭建
- 使用BeetlSQL
- 按照主鍵查尋
- 更新
- 按照模板查詢
- 執行SQL
- 執行模板SQL
- 使用Query
- 使用Mapper
- 使用模板文件
- SQLManager
- 內置語句
- 內置查詢API
- template查詢
- 更新操作
- 執行SQL
- 執行模板SQL
- 把SQL放到文件里
- 翻頁查詢
- SQLResult
- Stream查詢
- 存儲過程調用
- NameConversion(重要)
- DBStyle
- Inerceptor
- SQLManagerExtend
- 強制使用數據源
- Mapper
- 實現Mapper
- @Sql
- @Update @BatchUpdate
- @Template
- 參數名稱
- 參數返回值
- 執行SQL文件
- 翻頁查詢
- @SqlProvider
- @SpringData
- @SubQuery
- @InheritMapper
- @Call
- StreamData
- Default Method
- 定義自己的BaseMapper
- 限制Java代碼中SQL長度
- 數據模型
- POJO
- 不嚴格的POJO
- 交集(重要)
- @Table 注解
- @Column 注解
- 主鍵
- RowMapper
- ResultSetMapper
- Json配置映射
- Json自動映射
- XML支持
- 自動Fetch
- AttributeConvert
- BeanConvert
- 枚舉
- 混合模型
- Map模型
- 動態模型
- 模型其他注解
- 安全擴展注解
- BeetlSql 單表查詢工具Query
- Query使用方式和風格介紹
- Query主要操作簡介
- 查詢器獲取
- SELECT簡單的條件查詢
- 復雜的條件查詢
- 查詢字段智能處理
- 健壯的變量
- 自定義實現
- INSERT操作
- UPDATE操作
- DELETE操作
- single查詢和unique
- COUNT查詢
- GROUP分組查詢和Having子句
- 分頁查詢
- ORDER BY 排序
- page分頁查詢
- 方法調用順序
- Markdown文件
- Beetl 入門
- 定界符號
- 變量
- 算數表達式
- 邏輯表達式
- 控制語句
- 訪問變量屬性
- 判斷對象非空(重要)
- 調用方法
- 自定義方法
- 內置方法
- 標簽功能
- 附錄
- Idea 插件
- 代碼生成
- 多庫使用
- 業務主從庫
- 主從庫延遲問題
- 多個業務庫
- 合并多個業務庫 1
- 合并多個業務庫 2
- 單表多租戶
- 每個租戶一個表
- 多庫多租戶
- 使用ShardingSphere
- Saga(試驗)
- 關于Saga的一些認識
- 關于隔離性
- BeetlSQL Saga
- SagaMapper
- Saga 多庫事務實現
- Saga 微服務 實現
- 配置 Saga Server
- Swagger
- BeetlSQL 性能
- 測試方法
- 最新
- 2021-11-21
- 2020-9-28
- Spring 快速開始
- 環境準備
- 環境搭建
- SpringBoot 快速開始
- 環境準備
- 環境搭建
- 擴展BeetlSQL3
- 完整配置
- BaseMapper定制
- 代碼生成
- SQLExecutor定制
- 第三方
- MetadataManager
- JFinal集成
- ExecuteContext
- 參考ACT
- 數據庫表到Java對象
- Solon
- NameConversion
- ViewType
- RowMapper
- ResultSetMapper
- AttributeConvert
- BeanConvert
- Fetch
- 代碼生成
- 擴展BeetlSQL3
- BaseMapper定制
- SQLExecutor定制
- MetadataManager
- ExecuteContext
- 數據庫表到Java對象
- NameConversion
- ViewType
- RowMapper
- ResultSetMapper
- AttributeConvert
- BeanConvert
- Fetch
- 代碼生成
- BeetlSQL 多數據庫支持
- 多庫之間的不同
- 跨庫支持實現
- DBStyle
- MySqlStyle 例子
- H2Style例子
- ClickHouseStyle例子
- HBaseStyle例子
- DruidStyle例子
- MetadataManager
- BeanProcessor
- 與BeetlSQL2的區別
- 使用區別