Closed chenxu8989 closed 1 year ago
/Hi, 我看了一下异常调用栈。然后在本地复现了一下问题。
里面会抛出异常
public void setAutoCommit(boolean autoCommit) throws SQLException {
if (autoCommit) {
return;
}
throw new SQLFeatureNotSupportedException("Transactions are not supported");
}
conn = new ClickHouseDataSource(url, properties).getConnection();
public void setAutoCommit(boolean autoCommit) throws SQLException {
ensureOpen();
if (this.autoCommit == autoCommit) {
return;
}
ensureTransactionSupport();
if (this.autoCommit = autoCommit) { // commit
FakeTransaction tx = fakeTransaction.getAndSet(null);
if (tx != null) {
tx.logTransactionDetails(log, FakeTransaction.ACTION_COMMITTED);
tx.clear();
}
} else { // start new transaction
if (!fakeTransaction.compareAndSet(null, new FakeTransaction())) {
log.warn("[JDBC Compliant Mode] not able to start a new transaction, reuse the exist one");
}
}
}
但是 ClickHouse 是使用 JDBC 基类的逻辑,所以最简单的方法修复就在 ClickhouseOutputFormat 获取连接之前 jdbcConfig.setAutoCommit(true); 代码如下
@Override
protected Connection getConnection() throws SQLException {
jdbcConfig.setAutoCommit(true);
return ClickhouseUtil.getConnection(
jdbcConfig.getJdbcUrl(), jdbcConfig.getUsername(), jdbcConfig.getPassword());
}
一种可行的思路是在内存做聚合,超过阈值后溢写出文件,这个地方可以用 nio 去做,会有更好的效率。
ClickHouseDataSource 和 BalancedClickhouseDataSource 是两种用于连接 ClickHouse 数据库的不同数据源。这两者之间的主要区别在于负载均衡和故障转移的支持。
ClickHouseDataSource: 这是一个基本的数据源,它提供了简单的 ClickHouse 连接。当您使用 ClickHouseDataSource 时,您需要指定一个具体的 ClickHouse 服务器实例。如果您有多个实例,那么您需要手动处理负载均衡和故障转移。在单实例部署中,这是非常方便的。
BalancedClickhouseDataSource: 这是一个高级数据源,它支持负载均衡和故障转移。使用 BalancedClickhouseDataSource,您可以指定一组 ClickHouse 服务器实例,它会自动处理负载均衡和故障转移。这意味着,当一个实例出现问题时,BalancedClickhouseDataSource 将自动将请求重定向到其他可用的实例。这对于高可用性和大规模部署非常有用。
总之,如果您有一个简单的单实例部署或者愿意自己处理负载均衡和故障转移,可以使用 ClickHouseDataSource。然而,如果您希望自动负载均衡和故障转移,那么 BalancedClickhouseDataSource 是更好的选择。
ClickHouse JDBC 驱动程序提供了一个 JDBC Compliant Mode,它允许 ClickHouse 更好地与 JDBC 规范兼容。这种模式的目的是提高 ClickHouse 与使用 JDBC 接口的其他数据库系统的兼容性。
在 JDBC Compliant Mode 下,ClickHouse JDBC 驱动程序会尽可能地遵循 JDBC 规范。然而,由于 ClickHouse 与传统的关系型数据库系统有很大不同,某些功能可能无法完全符合 JDBC 规范。例如,事务支持、存储过程等功能在 ClickHouse 中可能无法实现。
启用 JDBC Compliant Mode 通常可以通过设置 clickHouseClient.jdbcCompliant 属性来实现。在创建 ClickHouseProperties 对象时,您可以设置这个属性,然后将属性传递给 ClickHouseDataSource 或 BalancedClickhouseDataSource。
1.12 的话 先配置 semantic 为 at-least-once
1.12 的话 先配置 semantic 为 at-least-once
这个是具体怎么设置呀,我也遇到相同的问题
1.12 的话 先配置 semantic 为 at-least-once 加了也一样报错
我的是把这里改成true就行,其它不用动。
2.Clickhouse 使用 ClickHouseDataSource 这个数据源获取连接的话,是可以设置事务的非自动提交的 setAutoCommit里调用的ensureOpen方法应该是自定义方法吧,以及后面的ensureTransactionSupport(),类FakeTransaction,应该都是大佬您自定义的吧,大佬可以把这些自定义的内容发出来吗? @chenxu8989
Search before asking
What happened
mysql 同步 clickhouse
job 配置
异常信息
What you expected to happen
mysql 同步 clickhouse
How to reproduce
mysql 同步 clickhouse
Anything else
No response
Version
1.12_release
Are you willing to submit PR?
Code of Conduct