Flink源码解析系列--DataStream JDBC-Sink

本文详细解析了Flink 1.15-SNAPSHOT版本中DataStream JDBC-Sink的源码,从JdbcOutputFormat的构造函数、JdbcConnectionProvider、JdbcExecutionOptions、StatementExecutorFactory、RecordExtractor,到GenericJdbcSinkFunction的实现路径。重点介绍了JdbcBatchStatementExecutor的执行逻辑和实时性保障机制,以及如何通过Lambda表达式构建函数接口。文章最后提出,可以基于反射动态构建Insert SQL和JdbcStatementBuilder,以支持POJO Sink。
摘要由CSDN通过智能技术生成

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.

进行源码分析之前,首先看一下Flink DataStream JDBC-Sink的官方示例:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env
	.fromElements(...)
	.addSink(JdbcSink.sink(
		"insert into books (id, title, author, price, qty) values (?, ?, ?, ?, ?)",
		(ps, t) -> {
			ps.setInt(1, t.id);
			ps.setString(2, t.title);
			ps.setString(3, t.author);
			ps.setDouble(4, t.price);
			ps.setInt(1, t.qty);
		},
		new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
			.withUrl(getDbMetadata().getUrl())
			.withDriverName(getDbMetadata().getDriverClass())
			.build()
	));	
env.execute();

可以看到,addSink传入的是JdbcSink类通过sink方法构建的。

Flink 中,`JdbcSink` 是将数据写入 JDBC 数据库的 Sink,如果数据无法写入数据库,则会抛出异常。可以通过以下方式进行捕获: 1. 在 `JdbcSink` 中重写 `invoke` 方法,并在方法中捕获异常。例如: ```java public class MyJdbcSink extends JdbcSink<Tuple2<String, Integer>> { @Override public void invoke(Connection connection, Tuple2<String, Integer> value, Context context) throws Exception { try { // 处理数据 } catch (Exception e) { // 捕获异常 } super.invoke(connection, value, context); } } ``` 2. 在 `StreamExecutionEnvironment` 中设置全局异常处理器。例如: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.getConfig().setGlobalJobParameters(params); env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime); env.setParallelism(1); env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime); env.getConfig().setGlobalJobParameters(params); env.setParallelism(1); env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE); env.getCheckpointConfig().setCheckpointTimeout(60000); env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime); env.getConfig().setGlobalJobParameters(params); env.setParallelism(1); // 设置全局异常处理器 env.getConfig().setGlobalJobParameters(params); env.getConfig().setRestartStrategy(RestartStrategies.fixedDelayRestart( 3, // 尝试重启的次数 Time.of(10, TimeUnit.SECONDS) // 时间间隔 )); env.getConfig().setGlobalJobParameters(params); env.setParallelism(1); // 添加 JdbcSink DataStream<Tuple2<String, Integer>> dataStream = ...; dataStream.addSink(new MyJdbcSink()); env.execute("My Flink Job"); ``` 通过以上两种方式,可以捕获 `JdbcSink` 写入数据时产生的异常。需要注意的是,捕获异常后需要根据实际情况进行处理,例如重试或将异常数据写入死信队列等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值