package com.taobao.tddl.repo.mysql.spi; import javax.sql.DataSource; import com.taobao.tddl.common.model.Group; import com.taobao.tddl.executor.common.ExecutorContext; import com.taobao.tddl.executor.common.TopologyHandler; import com.taobao.tddl.executor.spi.IDataSourceGetter; import com.taobao.tddl.executor.spi.IGroupExecutor; public class DatasourceMySQLImplement implements IDataSourceGetter { public DataSource getDatasourceByGroupNode(TopologyHandler topology, String groupNode) { if ("undecided".equals(groupNode)) { return null; } IGroupExecutor matrixExecutor = topology.get(groupNode); if (matrixExecutor == null) return null; /* * 这里做个hack吧。 原因是在构造topologic的时候,默认全部使用mysql作为type了。 * 这样就造成所有的Datasource都是由RemotingExecutor * com.taobao.ustore.jdbc.mysql.My_Reponsitory.buildRemoting(Group * group) 创建的,type都是mysql. * 但实际上这里的type需要根据实际的DataSource来决定是个oracle还是个mysql. * 如果是oracle那么type需要改成oracle.. */ Group.GroupType type = matrixExecutor.getGroupInfo().getType(); DataSource ds = (DataSource) matrixExecutor.getRemotingExecutableObject(); if (isNotValidateNode(type)) { throw new IllegalArgumentException("target node is not a validated Jdbc node"); } if (ds == null) { throw new IllegalArgumentException("can't find ds by group name "); } return ds; } protected boolean isNotValidateNode(Group.GroupType type) { return !Group.GroupType.MYSQL_JDBC.equals(type) && !Group.GroupType.TDHS_CLIENT.equals(type) && !Group.GroupType.ORACLE_JDBC.equals(type) && !Group.GroupType.OCEANBASE_JDBC.equals(type); } @Override public DataSource getDataSource(String group) { return getDatasourceByGroupNode(ExecutorContext.getContext().getTopologyHandler(), group); } }