Clickhouse的多种连接方式

  • Clickhouse-client
  • HTTP接口
  • JDBC

官网链接:https://clickhouse.com/docs/zh/interfaces/cli/

Clickhouse-client

ClickHouse提供了一个原生命令行客户端clickhouse-client客户端支持命令行操作clickhouse

$ clickhouse-client
ClickHouse client version 19.17.1.1579 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 19.17.1 revision 54428.

:)

连接clickhouse:

clickhouse-client --multiline -u username -h ip --password passowrd

指定multiline的含义是,如果指定了multiline:为了执行查询,需要以分号结尾并且按下Enter键。如果行末没有分号,将认为当前语句并没有输入完而要求继续输入下一行。

HTTP接口

有时候线上的服务器可能没有Clickhouse的客户端,因此直接利用clickhouse-client进行连接会出错,因此掌握使用HTTP连接的方式也是很有必要的。

HTTP接口允许您在任何编程语言的任何平台上使用Clickhouse。我们使用它在Java和Perl以及shell脚本中工作。HTTP接口比原生接口受到更多的限制,但它具有更好的兼容性。

默认情况下,clickhouse-server会在8123端口上监控HTTP请求(这可以在配置中修改)。

如果你发送了一个未携带任何参数的GET /请求,它会返回一个字符串 «Ok.»(结尾有换行)。可以将它用在健康检查脚本中。

比如:

$ curl 'http://localhost:8123/'
Ok.

访问指定ip的clickhouse,并携带用户名密码:

curl '-u username:password http://ip:port?max_memory_usage=100000000000000  --data-binary @-'

上面替换成自己的用户名、密码、ip地址和端口号即可。

如果想执行SQL操作,可以采用如下形式

比如想执行创建数据表的SQL:

$ echo 'CREATE TABLE t (a UInt8) ENGINE = Memory' | curl 'http://localhost:8123/' --data-binary @-

想执行查询操作的SQL:

$ echo 'SELECT count(*) from test.userinfo' | curl 'http://localhost:8123/' --data-binary @-
10

另一种方式,通过URL中的 query 参数来发送请求,或者发送POST请求,或者将查询的开头部分放在URL的query参数中,其他部分放在POST中(我们会在后面解释为什么这样做是有必要的)

比如如下这种方式:

curl '-u username:password http://ip:port/?query=SELECT%20COUNT(*)%20FROM%20test.userinfo --data-binary @-'

或者

'COUNT(*)%20FROM%20test.userinfo' | curl '-u username:password http://ip:port/?query=SELECT --data-binary @-'

这里一定要注意的是curl命令由于空格需要URL转移,所以一定要在空格处添加上%20。

URL的大小会限制在16KB,所以发送大型查询时要时刻记住这点。

JDBC

首先需要导入依赖:

<!-- 连接clickhouse -->
        <dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.1.54</version>
        </dependency>

接下来需要借助到两个核心类:ClickHousePropertiesClickHouseDataSource。前者用来保存连接Clickhosue所需要的参数,如用户名,密码等。后者用来获取dataSource连接。

代码如下:

		String url = "jdbc:clickhouse://10.224.192.133:8123/test";
        ClickHouseProperties properties = new ClickHouseProperties();
        properties.setUser("default");
        properties.setPassword("ch20482048");
        properties.setSessionId("default-session-id");


        ClickHouseDataSource dataSource = new ClickHouseDataSource(url, properties);
        String sql = "INSERT INTO test.ods_countlyV2 (appKey, appVersion, deviceId, phone_no) VALUES (?, ?, ?, ?)";


        try {
            // 获取数据库连接
             conn = dataSource.getConnection();
             PreparedStatement preparedStatement = conn.prepareStatement(sql);
             preparedStatement.setString(1,mail.getAppKey());
             preparedStatement.setString(2, mail.getAppVersion());
             preparedStatement.setString(3, mail.getDeviceId());
             preparedStatement.setString(4, mail.getPhone_no());

             preparedStatement.execute();
        }
        catch (Exception e){
            e.printStackTrace();
        }

首先定义了一个ClickHouseProperties的对象,用来保存连接Clickhouse所需的参数,比如用户名,密码。接下来,用该properties和url来构造一个连接Clickhouse的DataSource,并从该连接池获取连接conn。最后利用JDBC的prepareStatement,来对写好的SQL中的占位符进行赋值。调用execute方法执行SQL,将处理后的数据流插入到Clickhouse中。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐