🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 强制使用数据源 SQLMannager默认更新操作走主库,查询操作走从从库,如果想改变规则,可以从新实现ConnectionSource,或者使用forceDataSource强制使用某一个数据库 SQLMannager提供了forceDataSource(DBRunner)接口来强制使用某个数据源操作,比如主从库,默认查询走从库,你可以强制查询走主库,或者某个更新操作,想操作从库而不是主库 DBRunner默认提供如下实现,用户也可以自己实现DBRunner的getTargetDataSource方法 * MasterDBRunner, 操作使用主库 * SlaveDBRunner 操作使用第一个从库 * EachSlaveDbRunner 操作会使用每个从从库,比如insert语句,那么会在每个从库调用多次insert 比如如下初始化masterSlaveSqlManger(本例子代码来自单元测试ForceDataSourceTest) ``` ConnectionSource cs = ConnectionSourceHelper.getMasterSlave(master,new DataSource[]{slave,slave2}); SQLManagerBuilder builder = new SQLManagerBuilder(cs); builder.setDbStyle(new H2Style()); builder.setNc(new UnderlinedNameConversion()); builder.setInters(new Interceptor[]{new MyInterceptor()}); masterSlaveSqlManger = builder.build(); ``` 如下代码表示查询主库 ```java User user = masterSlaveSqlManger.forceDataSource(new DBRunner.MasterDBRunner<User>(){ @Override public User run(SQLManager sm) { return sm.single(User.class,1); } }); ``` 如下代码表示在从库插入一个User ```java User user = new User(); user.setName("test"); user.setId(19); masterSlaveSqlManger.forceDataSource(new DBRunner.SlaveDBRunner<Object>(){ @Override public Object run(SQLManager sm) { sm.insert(user); return null; } }); ``` 如下代码会在每个从库都执行insert语句 ```java User user = new User(); user.setName("test"); user.setId(29); //遍历每个slave,并执行 masterSlaveSqlManger.forceDataSource(new DBRunner.EachSlaveDbRunner(){ @Override public Object run(SQLManager sm) { sm.insert(user); return null; } }); ``` 用户也可以自己扩展DBRunner的getTargetDataSource方法来动态判断使用哪个库,如下根据id是否为偶数来判断走那个库 ```java Integer id = 1; User user = masterSlaveSqlManger.forceDataSource(new DBRunner<User>(){ @Override protected DataSource getTargetDataSource(SQLManager sqlManager) { return id%2==0?sqlManager.getDs().getMasterSource():sqlManager.getDs().getSlaves()[0]; } @Override public User run(SQLManager sm) { User user = sm.unique(User.class,id); return user ; } }); ```