Flink自定义Sink系列2

Flink自定义Sink系列之JDBC


前言

使用flink的官方JDBC连接器创建数据库的连接Sink

一、代码如下

代码如下(示例):

public class JDBCSink {

    public <T> SinkFunction<T> getSinkFunction(String sql){
        return JdbcSink.sink(sql,
                new JdbcStatementBuilder<T>() {
                    @Override
                    public void accept(PreparedStatement preparedStatement, T t) throws SQLException {
                        Class<?> aClass = t.getClass();
                        Field[] fields = aClass.getDeclaredFields();
                        Object o=null;
                        for (int i = 0; i < fields.length; i++) {
                            try {
                                fields[i].setAccessible(true);
                                o = fields[i].get(t);
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            }
                            preparedStatement.setObject(i+1,o);
                        }
                    }
                }, JdbcExecutionOptions.builder()
                        .withBatchSize(1000)
                        .withBatchIntervalMs(200)
                        .withMaxRetries(5)
                        .build()
        ,new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
        .withUrl("jdbc:postgresql://dbhost:5432/postgresdb")
        .withDriverName("org.postgresql.Driver")
        .withUsername("someUser")
        .withPassword("somePassword")
        .build());
    }
}

注意这里可以点进去源码看到,后面的实例不是new出来的,而是通过Build来创建的,但是这两个Build是有区别的,一个是static final,一个是staic,通过static final修饰,其实原理是一样的都是通过内部类来实现的

public static class JdbcConnectionOptionsBuilder {
		private String url;
		private String driverName;
		private String username;
		private String password;

		public JdbcConnectionOptionsBuilder withUrl(String url) {
			this.url = url;
			return this;
		}

		public JdbcConnectionOptionsBuilder withDriverName(String driverName) {
			this.driverName = driverName;
			return this;
		}

		public JdbcConnectionOptionsBuilder withUsername(String username) {
			this.username = username;
			return this;
		}

		public JdbcConnectionOptionsBuilder withPassword(String password) {
			this.password = password;
			return this;
		}

		public JdbcConnectionOptions build() {
			return new JdbcConnectionOptions(url, driverName, username, password);
		}
	}

第二种

    public static Builder builder() {
		return new Builder();
	}

	/**
	 * Builder for {@link JdbcExecutionOptions}.
	 */
	public static final class Builder {
		private long intervalMs = DEFAULT_INTERVAL_MILLIS;
		private int size = DEFAULT_SIZE;
		private int maxRetries = DEFAULT_MAX_RETRY_TIMES;

		public Builder withBatchSize(int size) {
			this.size = size;
			return this;
		}

		public Builder withBatchIntervalMs(long intervalMs) {
			this.intervalMs = intervalMs;
			return this;
		}

		public Builder withMaxRetries(int maxRetries) {
			this.maxRetries = maxRetries;
			return this;
		}

		public JdbcExecutionOptions build() {
			return new JdbcExecutionOptions(intervalMs, size, maxRetries);
		}
	}

对于内部类的使用是通过
new 主类.内部类().xxxx这样去实例化的。

总结

以上就是对flink jdbcsink的简单记录!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink 提供了自定义 Sink 的功能,可以让用户根据自己的需求实现自己的 Sink 函数。自定义 Sink 主要涉及两个步骤:实现一个继承自 `RichSinkFunction` 的类,并重写其中的方法;在 Flink 程序中使用自定义 Sink。 以下是一个简单的示例,展示如何自定义一个 Sink 函数: 首先,创建一个类继承自 `RichSinkFunction`: ```java public class CustomSink extends RichSinkFunction<String> { @Override public void invoke(String value, Context context) throws Exception { // 自定义的逻辑处理,这里示例只打印输出 System.out.println(value); } } ``` 然后,在 Flink 程序中使用自定义 Sink: ```java public class CustomSinkExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<String> stream = env.fromElements("message 1", "message 2", "message 3"); // 使用自定义Sink stream.addSink(new CustomSink()); env.execute("Custom Sink Example"); } } ``` 在上述示例中,自定义Sink 函数 `CustomSink` 继承自 `RichSinkFunction`,并实现了 `invoke` 方法,其中可以编写自己的数据处理逻辑。在 Flink 程序中,通过 `addSink` 方法将数据流发送到自定义 Sink 中进行处理。 需要注意的是,自定义 Sink 函数还可以使用一些钩子方法,如 `open` 和 `close`,可以在其中进行一些初始化和清理操作。 希望这个示例能够帮助你理解如何在 Flink自定义 Sink 函数。如果有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值