ClickHouse R2dbc 使用整理

1.pom

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-r2dbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.clickhouse</groupId>
            <artifactId>clickhouse-r2dbc</artifactId>
            <version>0.4.6</version>
            <classifier>all</classifier>
            <exclusions>
                <exclusion>
                    <groupId>*</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2.启动类

@SpringBootApplication(exclude = {R2dbcAutoConfiguration.class, R2dbcDataAutoConfiguration.class})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3.配置类

import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ClickhouseConfig {

    @Bean
    public ConnectionFactory getClickhouseConnect(){
        //r2dbc:clickhouse:http://{username}:{password}@{host}:{port}/{database}
        return ConnectionFactories.get(String.format("r2dbc:clickhouse:http://%s:%s@%s:%d/%s",{username},{password},{host},{port},{database}));
    }

}

4.ck 操作

参考官方例子,亲测,可用



@Repository
public class ClickRepository {

    @Autowired
    ConnectionFactory connectionFactory;

    public Flux<ClickStats> getStatsByDomain(String domain){
        return Mono.from(connectionFactory.create())
                .flatMapMany(conn -> conn.createStatement("select domain, path,  toDate(cdate) as d, count(1) as count from clickdb.clicks where domain = :domain group by domain, path, d")
                        .bind("domain", domain)
                        .execute())
                .flatMap(result -> result.map((row, rowMetadata) -> new ClickStats(row
                        .get("domain", String.class), row.get("path", String.class), row.get("d", LocalDate.class),  row.get("count", Long.class))));
    }

    public Mono<Void> add(Click click){
        return Mono.from(connectionFactory.create())
                .flatMapMany(conn -> execute(click, conn)).then();
    }

    private Publisher<? extends Result> execute(Click click, Connection conn) {
        return conn.createStatement("insert into clickdb.clicks values (:domain, :path, :cdate, :count)")
        .bind("domain", click.getDomain())
        .bind("path", click.getPath())
                .bind("cdate", LocalDateTime.now())
                .bind("count", 1).execute();
    }

}

上面的配置是连接单节点,集群配置

参考源码:

ClickHouseNodes 中会解析url中host判断是否有“,”分隔符。

所以集群配置:

//r2dbc:clickhouse:http://{username}:{password}@{host}:{port}/{database}

host 可以配置多个,直接用“,”分割,亲测,可用。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值