package com.alibaba.datax.plugin.rdbms.reader.util; import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.rdbms.reader.Constant; import com.alibaba.datax.plugin.rdbms.reader.Key; import com.alibaba.datax.plugin.rdbms.util.DBUtil; import com.alibaba.datax.plugin.rdbms.util.DataBaseType; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by liuyi on 15/9/18. */ public class HintUtil { private static final Logger LOG = LoggerFactory.getLogger(ReaderSplitUtil.class); private static DataBaseType dataBaseType; private static String username; private static String password; private static Pattern tablePattern; private static String hintExpression; public static void initHintConf(DataBaseType type, Configuration configuration){ dataBaseType = type; username = configuration.getString(Key.USERNAME); password = configuration.getString(Key.PASSWORD); String hint = configuration.getString(Key.HINT); if(StringUtils.isNotBlank(hint)){ String[] tablePatternAndHint = hint.split("#"); if(tablePatternAndHint.length==1){ tablePattern = Pattern.compile(".*"); hintExpression = tablePatternAndHint[0]; }else{ tablePattern = Pattern.compile(tablePatternAndHint[0]); hintExpression = tablePatternAndHint[1]; } } } public static String buildQueryColumn(String jdbcUrl, String table, String column){ try{ if(tablePattern != null && DataBaseType.Oracle.equals(dataBaseType)) { Matcher m = tablePattern.matcher(table); if(m.find()){ String[] tableStr = table.split("\\."); String tableWithoutSchema = tableStr[tableStr.length-1]; String finalHint = hintExpression.replaceAll(Constant.TABLE_NAME_PLACEHOLDER, tableWithoutSchema); //主库不并发读取 if(finalHint.indexOf("parallel") > 0 && DBUtil.isOracleMaster(jdbcUrl, username, password)){ LOG.info("master:{} will not use hint:{}", jdbcUrl, finalHint); }else{ LOG.info("table:{} use hint:{}.", table, finalHint); return finalHint + column; } } } } catch (Exception e){ LOG.warn("match hint exception, will not use hint", e); } return column; } }