<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 業務主從庫 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方法.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看