色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

flink寫入mysql并行度只能是1

錢琪琛2年前15瀏覽0評論

Flink是一個基于流式數據處理和批處理的開源框架,可以快速開發和執行高效、可擴展性的數據管道。而MySQL是一款廣泛使用的關系型數據庫,今天我們就來探討一下如何在Flink中將數據寫入MySQL。

public class MySQLSink extends RichSinkFunction<Tuple2<String,String>> {
private Connection connection;
private PreparedStatement preparedStatement;
public void open(Configuration parameters) throws Exception {
super.open(parameters);
connection = DriverManager.getConnection("jdbc:mysql://localhost/test","root","root");
preparedStatement = connection.prepareStatement("INSERT INTO user(name,age) VALUES (?,?)");
}
public void invoke(Tuple2<String,String> value) throws Exception {
preparedStatement.setString(1,value.f0);
preparedStatement.setInt(2,Integer.parseInt(value.f1));
preparedStatement.executeUpdate();
}
public void close() throws Exception {
super.close();
if(preparedStatement != null) {
preparedStatement.close();
}
if(connection != null){
connection.close();
}
}
}

上面的代碼展示了一個自定義的Flink Sink,可以將Stream中的Tuple2寫入MySQL中。但是需要注意的是,由于MySQL的JDBC驅動本身是線程不安全的,所以這個Sink的并行度只能是1。

那么為什么MySQL的JDBC驅動是線程不安全的呢?

這是由于MySQL采用了連接池,通過重復利用Connection對象來減少系統資源的占用。而Connection對象其實是非常昂貴的,尤其是在創建、銷毀和打開新會話時需要消耗很多的系統資源。所以,使用連接池可以極大地降低您程序的開銷。但是,由于MySQL連接池本身并不是線程安全的,所以在多線程中使用同一個Connection對象可能會導致各種錯誤和異常。

因此,如果您需要將數據寫入MySQL并保證數據的完整性和正確性,建議您將Sink的并行度設為1,避免在多線程并發訪問同一個數據庫連接時發生異常。