package kr.wisestone.owl.config.persistence.routing;
|
|
import com.google.common.collect.Lists;
|
import kr.wisestone.owl.config.persistence.aop.TransactionDefinitionInterceptor;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
public class TransactionDefinitionRoutingDataSource extends AbstractRoutingDataSource {
|
|
private Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
private List<Object> dataSourceKeys;
|
|
private final AtomicInteger currentIndex = new AtomicInteger();
|
|
@Override
|
public void setTargetDataSources(Map<Object, Object> targetDataSources) {
|
super.setTargetDataSources(targetDataSources);
|
this.dataSourceKeys = Lists.newArrayList(targetDataSources.keySet());
|
}
|
|
@Override
|
protected Object determineCurrentLookupKey() {
|
if (TransactionDefinitionInterceptor
|
.isCurrentTransactionReadOnly()
|
&& !dataSourceKeys.isEmpty()) {
|
int size = dataSourceKeys.size();
|
Object key = dataSourceKeys.get(currentIndex.getAndIncrement() % size);
|
return key;
|
}
|
return null;
|
}
|
|
}
|