簡體   English   中英

Apache Storm - 從 SPOUT 訪問數據庫 - 連接池

[英]Apache Storm - Accessing database from SPOUT - connection pooling

有一個噴口,每次滴答都會轉到 Postgre 數據庫並讀取額外的一行。 噴口代碼如下所示:

class RawDataLevelSpout extends BaseRichSpout implements Serializable {


private int counter;

SpoutOutputCollector collector;


@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("col1", "col2"));
}

@Override
public void open(Map map, TopologyContext context, SpoutOutputCollector spoutOutputCollector) {
    collector = spoutOutputCollector;
}

private Connection initializeDatabaseConnection() {

    try {
        Class.forName("org.postgresql.Driver");
        Connection connection = null;
        connection = DriverManager.getConnection(
                DATABASE_URI,"root", "root");
        return connection;
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
public void close() {

}

@Override
public void nextTuple() {
    List<String> values = new ArrayList<>();

    PreparedStatement statement = null;
    try {
        Connection connection = initializeDatabaseConnection();
        statement = connection.prepareStatement("SELECT * FROM table1 ORDER BY col1 LIMIT 1 OFFSET ?");
        statement.setInt(1, counter++);
        ResultSet resultSet = statement.executeQuery();
        resultSet.next();
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int totalColumns = resultSetMetaData.getColumnCount();
        for (int i = 1; i <= totalColumns; i++) {
            String value = resultSet.getString(i);
            values.add(value);
        }


        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    collector.emit(new Values(values.stream().toArray(String[]::new)));
}

}

如何在 Apache Storm 中處理 Spouts 中的連接池的標准方法是什么? 此外,是否有可能以某種方式同步集群拓撲中多個運行實例的 coutner 變量?

關於連接池,如果需要,您可以通過靜態變量來池連接,但由於不能保證所有 spout 實例都在同一個 JVM 中運行,因此我認為沒有任何意義。

不,沒有辦法同步計數器。 spout 實例可能運行在不同的 JVM 上,並且您不希望它們在 spout 同意計數器值時全部阻塞。 不過,我認為您的 spout 實現沒有意義。 如果您只想一次讀取一行,為什么不只運行單個 spout 實例,而不是嘗試同步多個 spout?

您似乎試圖將關系數據庫用作隊列系統,這可能不太合適。 考慮使用例如 Kafka。 我認為您應該能夠使用https://www.confluent.io/product/connectors/http://debezium.io/ 之一將數據從 Postgres 流式傳輸到 Kafka。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM