CkickHouse JDBC 使用整理

1. pom 引入

        <dependency>
            <groupId>com.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.4.6</version>
        </dependency>


        <dependency>
            <groupId>org.roaringbitmap</groupId>
            <artifactId>RoaringBitmap</artifactId>
            <version>0.9.31</version>
        </dependency>
RoaringBitmap 个人觉得比较好用,可以不用引入。

2. JDBC 配置

    /**
     * 在高版本中 ClickHouseProperties 类已去掉,直接使用Properties。
     * url 格式:jdbc:clickhouse://host1:port,host2:port.../db
     * 集群模式也不再使用 BalancedClickhouseDataSource 
     * @return
     * @throws SQLException
     */
    public ClickHouseConnection getConnection() throws SQLException {
        Properties pro = new Properties();
        pro.setProperty("socket_timeout", 60000);
        //pro.setProperty(ClickHouseClientOption.SOCKET_TIMEOUT.getKey(),60000);
        ClickHouseDataSource clickHouseDataSource = new ClickHouseDataSource(url,pro);
        return clickHouseDataSource.getConnection(username,password);
    }


    /**
     * 和 ClickHouseDataSource 创建连接底层一致都是用 ClickHouseJdbcUrlParser.parse(url, properties)
     * @return
     * @throws SQLException
     */
    public Connection getConnectionByJDBC() throws SQLException {
        //DriverManager.getConnection(url, pro );
        return DriverManager.getConnection(url, username, password);
    }

源码中有注明 jdbcurl 格式,集群模式,多个节点直接用","隔开

客户端参数设置,源码中ClickHouseClientOption 类中设置了参数的默认值,可以查看该类,依据自己需要通过Properties进行修改。

还有非客户端参数,可以通过 ClickHouseHttpOption 里面的参数设置,如:设置custom_http_headers 相关参数

pro.set(ClickHouseHttpOption.CUSTOM_HEADERS.getKey(),"xxx")

可以参考官方 github 升级说明:clickhouse-java/clickhouse-jdbc at v0.4.6 · ClickHouse/clickhouse-java · GitHub

3. 查询

    /**
     * 执行查询,返回ResultSet
     * @param sql
     * @return
     * @throws SQLException
     */
    public static ResultSet executeQuery(String sql) throws SQLException {
        return getConnection()
            .createStatement()
            .executeQuery(sql);
    }

    /**
     * 获取bitmap, sql 只返回一个字段 字段结构为bitmap
     * @param sql
     * @return
     * @throws SQLException
     */
    public static ClickHouseBitmap getBitmap(String sql) throws SQLException {
        ResultSet resultSet = executeQuery(sql);
        if (resultSet.next()){
            return resultSet.getObject(1,ClickHouseBitmap.class);
        }else {
            return ClickHouseBitmap.empty();
        }
    }

    /**
     * 将结果转为 RoaringBitmap,比 ClickHouseRoaringBitmap 好用一些
     * @param sql
     * @return
     * @throws SQLException
     */
    public static RoaringBitmap getRoaringBitmap(String sql) throws SQLException {
        ClickHouseBitmap clickHouseBitmap = getBitmap(sql);
        return (RoaringBitmap) clickHouseBitmap.unwrap();
    }

ResultSet 必须调用 next() 方法。查看源码currentRow 初始为null,直接取ResultSet 取不到。

获取ResultSet 中的多个字段

        ResultSet resultSet = ClickhouseService.executeQuery(sql);
        while (resultSet.next()){
            ResultSetMetaData rsmd = resultSet.getMetaData();
            String column1= resultSet.getString(rsmd.getColumnName(1));
            String column2= resultSet.getString(rsmd.getColumnName(2));
            String column3= resultSet.getString(rsmd.getColumnName(3));
            
        }
        

记录一个错误:

执行 insert into 语句报错:

java.sql.SQLException: LZ4 is not supported

多加了一个配置 properties.setProperty(ClickHouseClientOption.COMPRESS_ALGORITHM.getKey(),"gzip")

继续报错 

UnknownException, code: 1002

解决:引入配置

        <dependency>
            <groupId>org.lz4</groupId>
            <artifactId>lz4-java</artifactId>
            <version>1.8.0</version>
        </dependency>

删除  properties.setProperty(ClickHouseClientOption.COMPRESS_ALGORITHM.getKey(),"gzip")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值