Flink1.18 Sink - 到JDBC 使用新依赖【因返回值是sinkFunction, 故目前只支持addSink使用, 1.18版本不支持sinkTo】

自行修改对应数据库参数和配置

package com.xiaohu.sink;

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.connector.jdbc.JdbcConnectionOptions;
import org.apache.flink.connector.jdbc.JdbcExecutionOptions;
import org.apache.flink.connector.jdbc.JdbcSink;
import org.apache.flink.connector.jdbc.JdbcStatementBuilder;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.sql.PreparedStatement;
import java.sql.SQLException;

/*
    导入依赖:
        flink-connector-jdbc
        mysql-connector-java

    目前只能用addSink做法

 */
public class JDBCSinkDemo {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        // 假设这是我们的数据源
//        DataStream<String> text = env.fromElements(
//                "Hello, World!",
//                "Flink is awesome!",
//                "This is a test."
//        );

        DataStreamSource<String> text = env.socketTextStream("master", 7777);


        // 转换数据以匹配目标表的列
        DataStream<String[]> mappedData = text.map(new MapFunction<String, String[]>() {
            @Override
            public String[] map(String value) {
                return new String[]{null, value};  // null 表示自增ID
            }
        });

        /*
                        "jdbc:mysql://master:3306/xiaohu_db?useUnicode=true&characterEncoding=utf-8&useSSL=false",
                        "com.mysql.cj.jdbc.Driver",
                        "root",
                        "123456",
                        500
         */
        mappedData.addSink(JdbcSink.sink(
                "INSERT INTO sink_jdbc (info) VALUES (?)",
                new JdbcStatementBuilder<String[]>() {
                    @Override
                    public void accept(PreparedStatement preparedStatement, String[] strings) throws SQLException {
                        preparedStatement.setString(1, strings[1]);
                    }
                },
                JdbcExecutionOptions.builder() // 处理设置
                        .withBatchSize(1000) // 一批次1000条
                        .withBatchIntervalMs(200) // 200毫秒或上面的1000条,就写出去
                        .withMaxRetries(5) // 重试5次
                        .build(),
                new JdbcConnectionOptions.JdbcConnectionOptionsBuilder() // 连接选项,new一个内部类
                        .withUrl("jdbc:mysql://master:3306/xiaohu_db?useUnicode=true&characterEncoding=utf-8&useSSL=false")
                        .withDriverName("com.mysql.cj.jdbc.Driver")
                        .withUsername("root")
                        .withPassword("123456")
                        .withConnectionCheckTimeoutSeconds(60) //超时60秒重新连接
                        .build()
        ));

        // 执行任务
        env.execute("Write to MySQL Example");
    }
}
posted @   Xiaohu_BigData  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示