package com.kugou.loader.clickhouse; import com.google.common.collect.Maps; import com.kugou.loader.clickhouse.config.ClickhouseConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import ru.yandex.clickhouse.util.apache.StringUtils; import java.sql.SQLException; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by jaykelin on 2016/11/25. */ public class ClickhouseClientHolder { private static final Log log = LogFactory.getLog(ClickhouseClientHolder.class); private static Map<String, ClickhouseClient> clientHolders = Maps.newHashMap(); private static Pattern CLICKHOUSE_CONNECT_PATTERN = Pattern.compile("^jdbc:clickhouse://([\\d\\.\\-_\\w]+):(\\d+)/([\\d\\w\\-_]+)(\\?.+)?$"); public static synchronized ClickhouseClient getClickhouseClient(ClickhouseConfiguration config) throws SQLException{ return getClickhouseClient(config.getConnectUrl(), config.getUsername(), config.getPassword()); } public static synchronized ClickhouseClient getClickhouseClient(String host, int port, String database) throws SQLException { String key = "jdbc:clickhouse://"+host+":"+port+"/"+database; if(!clientHolders.containsKey(key)){ clientHolders.put(key, new ClickhouseClient(host, port, database)); } return clientHolders.get(key); } public static synchronized ClickhouseClient getClickhouseClient(String host, int port, String database, String username, String password) throws SQLException { if(StringUtils.isBlank(username) || StringUtils.isBlank(password)){ return getClickhouseClient(host, port, database); } String key = "jdbc:clickhouse://"+username+":"+password+"@"+host+":"+port+"/"+database; if(!clientHolders.containsKey(key)){ clientHolders.put(key, new ClickhouseClient(host, port, database, username, password)); } return clientHolders.get(key); } public static synchronized ClickhouseClient getClickhouseClient(String connectionUrl) throws SQLException { if(!clientHolders.containsKey(connectionUrl)){ clientHolders.put(connectionUrl, new ClickhouseClient(connectionUrl)); } return clientHolders.get(connectionUrl); } public static synchronized ClickhouseClient getClickhouseClient(String connectionUrl, String username, String password) throws SQLException { log.info("Clickhouse Loader : get clickhouse client["+connectionUrl+"] for user="+username); if(StringUtils.isBlank(username) || StringUtils.isBlank(password)){ return getClickhouseClient(connectionUrl); } Matcher m = CLICKHOUSE_CONNECT_PATTERN.matcher(connectionUrl); if(!m.matches()){ throw new IllegalArgumentException("Cannot parse jdbc connect : "+connectionUrl); } String key = "jdbc:clickhouse://"+username+":"+password+"@"+m.group(1)+":"+m.group(2)+"/"+m.group(3); if(!clientHolders.containsKey(key)){ clientHolders.put(key, new ClickhouseClient(connectionUrl, username, password)); } return clientHolders.get(key); } }