阿飞Javaer,转载请注明原创出处,谢谢!!
源码分析
位于sharding-jdbc-core
模块下的包com.dangdang.ddframe.rdb.sharding.hint
中,核心类HintManagerHolder的部分源码如下:
/**
* Hint manager holder.
* <p>Use thread-local to manage hint.</p>
* @author zhangliang
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class HintManagerHolder {
// hint特性保存数据的核心变量,即保存一个HintManager类型对象到ThreadLocal中
private static final ThreadLocal<HintManager> HINT_MANAGER_HOLDER = new ThreadLocal<>();
/**
* Set hint manager.
* @param hintManager hint manager instance
*/
public static void setHintManager(final HintManager hintManager) {
Preconditions.checkState(null == HINT_MANAGER_HOLDER.get(), "HintManagerHolder has previous value, please clear first.");
HINT_MANAGER_HOLDER.set(hintManager);
}
public static boolean isUseShardingHint() {
// 判断当前线程中是否使用了sharding hint--即HintManager中的shardingHint为true
return null != HINT_MANAGER_HOLDER.get() && HINT_MANAGER_HOLDER.get().isShardingHint();
}
public static Optional<ShardingValue<?>> getDatabaseShardingValue(final ShardingKey shardingKey) {
// 如果使用了sharding hint,那么从ThreadLocal中取数据库的sharding值
return isUseShardingHint() ? Optional.<ShardingValue<?>>fromNullable(HINT_MANAGER_HOLDER.get().getDatabaseShardingValue(shardingKey)) : Optional.<ShardingValue<?>>absent();
}
public static Optional<ShardingValue<?>> getTableShardingValue(final ShardingKey shardingKey) {
// 如果使用了sharding hint,那么从ThreadLocal中取表的sharding值
return isUseShardingHint() ? Optional.<ShardingValue<?>>fromNullable(HINT_MANAGER_HOLDER.get().getTableShardingValue(shardingKey)) : Optional.<ShardingValue<?>>absent();
}
public static