Java保存数据到ClickHouse连接超时失败code 1002 failed to respon
【已解决】Java保存数据超时失败 ClickHouse exception, code 1002, 8123 failed to respon,k.Java连接ClickHouse有以下几种方式1、使用JDBCClickHouse提供了JDBC驱动,可以使用JDBC API连接到ClickHouse,类似于连接其他关系型数据库。可以使用Java中的JDBC API对ClickHouse进行操作,
·
ClickHouse介绍
ClickHouse
是俄罗斯搜索引擎Yandex
开发的一个高性能列式数据库系统,支持SQL
查询,具有高并发、高可靠、高扩展性等特点Java
连接ClickHouse
有以下几种方式- 1、使用
JDBC
连接:ClickHouse
提供了JDBC
驱动,可以使用JDBC API
连接到ClickHouse
,类似于连接其他关系型数据库。可以使用Java中
的JDBC API
对ClickHouse
进行操作,例如执行SQL
查询、插入、更新、删除等操作。连接方式如下:
Class.forName("ru.yandex.clickhouse.ClickHouseDriver");
Connection conn = DriverManager.getConnection("jdbc:clickhouse://localhost:8123/test","default","");
- 2、使用
ClickHouse-Java
客户端连接:ClickHouse-Java
是一个基于HTTP
协议的ClickHouse
客户端,具有跨平台、跨语言、易于使用等特点。可以使用Java
代码通过ClickHouse-Java
连接到ClickHouse
并执行查询、插入、更新、删除等操作。连接方式如下:
ClickHouseDataSource dataSource = new ClickHouseDataSource("jdbc:clickhouse://localhost:8123/test");
- 3、使用
ORM
框架连接:如果使用的Java应用涉及数据存储的逻辑比较复杂,可以使用ORM
框架连接到ClickHouse
,例如Hibernate
、MyBatis
等。ORM
框架会自动将Java
对象映射到ClickHouse
中的表结构,简化了代码编写和维护。ORM
框架连接方式和其他数据库连接方式类似,需要根据具体框架进行配置和使用。 - 我们使用
clickhouse
作为大数据组件,存储前端设备实时采集到的海量数据,用做大数据的存储和分析
问题介绍
- 我们使用
Java
语言开发,连接数据库保存数据,实时分批写入 - 我们程序使用的是
clickhouse
的jdbc
驱动方式,maven
依赖如下:
<!-- clickhouse 相关依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.2.6</version>
</dependency>
<!-- clickhouse end -->
- 一开始使用时,未发现超时问题,后面连接上比较多的雷达设备后,数据量写入压力大增,写入报错,连接超时
- 使用
DruidDataSource
建立连接,连接里已经设置了超时时间
@Bean(name = "clickHouseDataSource")
@ConditionalOnProperty(prefix = "spring.datasource.click-house",name = "url")
public DataSource clickHouseDataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(url);
datasource.setDriverClassName(driverClassName);
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setUsername(username);
datasource.setPassword(password);
Properties properties = new Properties();
properties.put("socket_timeout", timeout);
datasource.setConnectProperties(properties);
return datasource;
}
clickkouse
保存失败,报错信息截取如下
Caused by: ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception,
code: 1002, host: 192.168.1.100, port: 8123; failed to respond
- 关键报错截取为
code 1002, 8123 failed to respon
,报错信息也很明显,就是连接超时 - 使用数据库工具测试数据库是否可以连接,发现
clickhouse
仍然是可以连接的,服务正常 - 此时,问题已经很明显了,这个就是
Java
程序连接clickhouse
的超时问题
解决写入超时
- 数据库连接超时,是偶现现象。数据库与程序都在一个网络环境内,网络连接应该是没问题的
- 连接超时,有可能是程序的写入或查询数据量过大,数据库未在限定时间范围内返回结果,程序认定超时,抛出报错
- 程序连接的代码已经设置了超时时间,还是报了这个错误,找其他原因
- 最终发现还需要修改
clickhouse
数据库设置,就是clickhouse
服务端的参数配置 - 修改
clickhouse
配置文件,/etc/clickhouse-server
下config.xml
的keep_alive_timeout
参数,默认是3,可以改为60s
<!-- For 'Connection: keep-alive' in HTTP 1.1 -->
<keep_alive_timeout>3</keep_alive_timeout>
- 重启clickhouse服务(
systemctl restart clickhouse-server
),问题解决 - 对于写入压力的问题,除了修改超时时间,也要减少写入次数,clickhouse是允许一批写入大量数据的
- 我们的做法是,使用kafka作为数据来源于clickhouse的中间装置,kafka接收数据后,在一定条件(一定毫秒数或一定数据量)后,作为一批数据,批量发送给clickhouse的写入程序,批量写入
- 有兴趣的小伙伴可以参考我这篇博客:Spring-kafka配置参数详解,消息批量发送与批量接收消费
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献14条内容
所有评论(0)