CK集群jdbc连接方式
jdbc url的定义
多个地址使用逗号隔开
String jdbcUrl = "jdbc:clickhouse://{ip1:port},{ip2:port},..."
其中url中可以带用户名密码,带上的使用方法
String jdbcUrl = "jdbc:clickhouse://{ip1:port},{ip2:port}/dbName?uese=zb&password=123456"
但需要注意的是,驱动包对于传入的jdbc url首先会进行一个模式匹配,判断出是否符合正则表达式,源码是
private static final Pattern URL_TEMPLATE = Pattern.compile(JDBC_CLICKHOUSE_PREFIX + "" +
"//([a-zA-Z0-9_:,.-]+)" +
"(/[a-zA-Z0-9_]+" +
"([?][a-zA-Z0-9_]+[=][a-zA-Z0-9_]+([&][a-zA-Z0-9_]+[=][a-zA-Z0-9_]+)*)?" +
")?");
Matcher m = URL_TEMPLATE.matcher(url);
Validate.ensure(m.matches(), "Incorrect url: " + url);
对于url的每一部分都有相关的正则进行匹配,所以只到数据库后面不传入其它参数,带?号是不对的,以及密码中穿线一下%等字符也不在匹配范围内,如果密码出现了特殊字符怎么办,一是修改源码,二是在可以修改密码的条件下修改密码,三是使用Properties传入用户名和密码
jdbc url的解析获取到连接
不管是官方的驱动包
import ru.yandex.clickhouse.BalancedClickhouseDataSource;
还是官方支持的第三方包
import com.github.housepower.jdbc.BalancedClickhouseDataSource;
都可用下面的解析方式获取连接对象
Connection conn = new BalancedClickhouseDataSource(jdbcUrl).getConnection()
连接后执行操作
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT .....")