Clickhouse客户端访问(CLI和JDBC)

Clikchouse底层支持HTTP和TCP两种协议。其中HTTP的端口为8123,它拥有更好的兼容性。TCP协议则拥有更好的性能,默认端口为9000。一般都是通过CLI和JDBC这两些封装接口去访问,因为它们更加简单和方便。

1、CLI

CLI(Command line Interface)即命令行接口。它的底层是基于TCP协议的。相信用过数据库的人都很熟悉这类方式。它分为两种,一种为交互式执行,一种则为非交互式执行。

交互式执行是登录客户端,然后使用SQL进行有来有回,一问一答的形式。二非交互式执行则一般用于批处理,比如批量数据导入,批量数据导出等等。

交互式执行

# 登录操作
clickhouse-client

非交互式执行

# 执行批量数据的导入
clickhouse-client --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv

clickhouse-client的参数简介
这里只介绍一些常用,其余的参数可以执行clickhouse-client --help查看,有着非常多的参数。

  • -h [ --host ] arg (=localhost):指定服务器地址,默认为localhost
  • –port arg (=9000) :指定服务器的TCP端口,默认为9000
  • -u [ --user ] arg (=default) :指定客户端登录账号
  • –password arg:指定客户端登录密码
  • -C [ --config-file ] arg:指定配置文件的路径
  • -c [ --config ] arg:同上,两者功能一致
  • -q [ --query ] arg:用于指定SQL语句
  • -d [ --database ] arg:用于指定数据库

2、JDBC

Clickhouse支持标准的JDBC协议。Clickhouse的驱动分为两种:
1)官方驱动
2)第三方驱动

  • ClickHouse-Native-JDBC
  • clickhouse4j

第三方驱动产生的原因是不满足官方驱动的性能或者使用场景而基于官方驱动产生的。这边主要介绍官方驱动,第三方驱动的使用方式可浏览github的手册。

官方驱动包的maven依赖:

<dependency>
    <groupId>ru.yandex.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.2.5</version>
</dependency>

它的使用方式也非常的简单,举个🌰:

package com.yzx.ch.demo;

import java.sql.*;

public class ClickHouseDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 初始化驱动,CH的驱动驱动Class为:ru.yandex.clickhouse.ClickHouseDriver
        Class.forName("ru.yandex.clickhouse.ClickHouseDriver");
        // URL syntax: jdbc:clickhouse://<host>:<port>[/<database>], e.g. jdbc:clickhouse://localhost:8123/test
        String url = "jdbc:clickhouse://192.168.188.178:8123/system";
        // 用户名和密码
        String user = "default";
        String password = "123456";
        // 创建连接
        Connection con = DriverManager.getConnection(url, user, password);
        // 创建Statement对象
        Statement statement = con.createStatement();
        // 执行查询操作(查询ch中有哪些库)
        ResultSet rs = statement.executeQuery("select name from `system`.databases d ");
        while (rs.next()){
            System.out.println(rs.getString(1));
        }
        con.close();
    }
}

Clickhouse还支持高可用模式,这种一般用于Clickhouse集群。它可以设置多个host地址,每次都会从可用的地址中随机选择一个进行连接。

package com.yzx.ch.demo;

import ru.yandex.clickhouse.BalancedClickhouseDataSource;
import ru.yandex.clickhouse.settings.ClickHouseProperties;

import java.sql.*;

public class ClickHouseDemo2 {
    public static void main(String[] args) throws SQLException {
        // URL syntax: jdbc:clickhouse://<host1>:<port1>,<host2>:<port2>,...[/<database>]
        String url = "jdbc:clickhouse://192.168.198.163:8123,192.168.198.164:8123/system";
        ClickHouseProperties chp = new ClickHouseProperties();
        // 用户名和密码
        chp.setUser("default");
        chp.setPassword("6lYaUiFi");
        // 声明数据源
        BalancedClickhouseDataSource bcd = new BalancedClickhouseDataSource(url, chp);
        // 创建连接
        Connection con = bcd.getConnection();
        // 创建Statement对象
        Statement statement = con.createStatement();
        // 执行查询操作(查询ch中有哪些库)
        ResultSet rs = statement.executeQuery("select name from `system`.databases d ");
        while (rs.next()){
            System.out.println(rs.getString(1));
        }
        con.close();
    }
}

但是,BalancedClickhouseDataSource拥有一个很大的缺陷,即connection是以http方式与服务端建立请求链接,每一次调用getConnection 都会建立一次新的链接,并且是以随机的方式与集群中的一台服务建立链接,如果其中一个服务挂掉,BalancedClickhouseDataSource在默认情况下是无法检测出来的。

就算以定期的方式检查集群中每一台服务是否正常可用,将可用的服务加入到待请求列表。也无法避免发生检查周期之间服务发生故障,而产生链接的情况。

因此,我们会用别的方式来代替BalancedClickhouseDataSource。一种是用nginx,另一种是用F5。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sileiH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值