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>
接下来需要借助到两个核心类:ClickHouseProperties
,ClickHouseDataSource
。前者用来保存连接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中。