我有一个风暴拓扑,可以将一些数据从Kafka队列写入Cassandra DB。该程序是多线程的。为了便于插入cassandra数据库,我将其作为我的DBUtils:
public DBUtils() {
if(session == null) {
session = CassandraUtil.getInstance().getSession();
LOG.info("Started a new session for dbUtils-Monitoring.....");
}
synchronized(session) {
testMapper = new MappingManager(session).mapper(TestVO.class);
}
}
所以,我使用synchronized在所有正在运行的线程中创建一个dbUtils实例。但是当我检查日志时,似乎会话正在初始化多次。风暴拓扑中的dbUtils仅在prepare方法中初始化,并且已在准备/执行/清理方法中使用。因此,如果我想在所有线程中使用的变量在多个位置使用,则不确定如何使用synchronized块。 我的问题是如何在所有线程中只对session / dbUtils变量进行一次初始化。
答案 0 :(得分:0)
由于Storm是分布式系统,因此您不能在所有并行运行的螺栓上拥有单个共享变量。您只能在单个工作JVM中共享执行程序上的变量。
为此,您需要创建一个static
变量并使用共享/静态对象实例来同步其初始化。