欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

flink寫入mysql并行度只能是1

錢琪琛1年前14瀏覽0評論

Flink是一個基于流式數(shù)據(jù)處理和批處理的開源框架,可以快速開發(fā)和執(zhí)行高效、可擴(kuò)展性的數(shù)據(jù)管道。而MySQL是一款廣泛使用的關(guān)系型數(shù)據(jù)庫,今天我們就來探討一下如何在Flink中將數(shù)據(jù)寫入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驅(qū)動本身是線程不安全的,所以這個Sink的并行度只能是1。

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

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

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