package me.test.db.router;
import java.util.Stack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.transaction.support.TransactionSynchronizationManager;
public class RoutingDataSourceImpl extends AbstractRoutingDataSource {
private static final String PREFIX = RoutingDataSourceImpl.class.getName() + ".";
public static final String DATASOURCE_RSC_KEY = PREFIX + "DATASOURCE_RSC_KEY";
private static final Logger logger = LoggerFactory.getLogger(RoutingDataSourceImpl.class);
@Override
protected Object determineCurrentLookupKey() {
@SuppressWarnings("unchecked")
Stack<String> keyStack = (Stack<String>) TransactionSynchronizationManager.getResource(DATASOURCE_RSC_KEY);
if (keyStack == null || keyStack.empty()) {
return null;
}
String dataSourceKey = keyStack.peek();
if (logger.isTraceEnabled()) {
logger.trace("using dataSource by key : {}", dataSourceKey);
}
return dataSourceKey;
}
}