package com.taobao.tddl.common;
import com.taobao.tddl.common.model.ThreadLocalString;
import com.taobao.tddl.common.utils.thread.ThreadLocalMap;
/**
* 提供给单独使用GroupDataSource的用户指定数据源以及相关执行信息
*
* @author junyu
*/
public class GroupDataSourceRouteHelper {
/**
* 从一组数据源中选择一个指定序号上的数据源执行SQL。 如:groupKey=ExampleGroup 对应的content为
* db1:rw,db2:r,db3:r
*
* <pre>
* RouteHelper.executeByGroupDataSourceIndex(2);
* jdbcTemplate.queryForList(sql);
* </pre>
*
* 最终查询肯定会在第三个数据源上执行(db3) 注意,指定db的读写特性需要满足要求,如不可在 指定只读数据源上进行写操作,否则抛错。
*
* @author junyu
* @param dataSourceIndex 在指定Group中,所需要执行的db序号
*/
public static void executeByGroupDataSourceIndex(int dataSourceIndex) {
ThreadLocalMap.put(ThreadLocalString.DATASOURCE_INDEX, dataSourceIndex);
}
public static void executeByGroupDataSourceIndex(int dataSourceIndex, boolean failRetry) {
ThreadLocalMap.put(ThreadLocalString.DATASOURCE_INDEX, dataSourceIndex);
ThreadLocalMap.put(ThreadLocalString.RETRY_IF_SET_DS_INDEX, failRetry);
}
/**
* 为了保证一个线程执行多个操作不造成混乱(例如事务中作多个操作),
* 请对每个业务方法做try-finally,并在finally中调用该方法清除index: try{
* GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(0);
* xxxDao.bizOperationxxx(); }finally{
* GroupDataSourceRouteHelper.removeGroupDataSourceIndex(); }
*/
public static void removeGroupDataSourceIndex() {
ThreadLocalMap.remove(ThreadLocalString.DATASOURCE_INDEX);
}
}