问题
- 使用clickhouse作为数据库,存储前端设备采集到的海量数据
- 使用Java语言开发,连接数据库保存数据,实时分批写入,使用的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;
}
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
),问题解决