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 dataSourceKeys; private final AtomicInteger currentIndex = new AtomicInteger(); @Override public void setTargetDataSources(Map 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; } }