0

Kafka 대기열에서 Cassandra DB로 일부 데이터를 쓰는 스톰 토폴로지가 있습니다. 이 프로그램은 다중 스레드 프로그램입니다. 카산드라의 dB의 삽입을 용이하게하기 위해, 나는 내 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); 
    } 
} 

가 그래서, 실행중인 모든 스레드를 통해 단일 dbUtils 인스턴스를 생성하는 동기화 사용했다. 하지만 로그를 확인하면 세션이 여러 번 초기화되는 것처럼 보입니다. 스톰 토폴로지의 dbUtils는 준비 메소드에서만 초기화되었으며 준비/실행/정리 메소드에서 사용되었습니다. 따라서 모든 스레드에서 사용하려는 변수가 여러 위치에서 사용되는 경우 동기화 된 블록을 사용하는 방법을 잘 모릅니다. 내 질문은 모든 스레드에서 세션/dbUtils 변수의 초기화를 한 번만 수행하는 방법입니다.

+0

그래서 실제로는 threadsafe [Singleton] (http://stackoverflow.com/documentation/java/130/singletons#t=201608121142368276512)를 원하십니까? – Fildor

+0

예! 나는 지금까지 2 개의 솔루션을 사용했다 : 하나는 java.util.concurrent이고 다른 하나는 동기화이다. 둘 다 평범한 자바 코드로 잘 작동하지만 스톰의 경우에는 작동하지 않습니다. Storm은 다른 멀티 스레딩 메커니즘을 따르고 있습니까? –

+1

사실, 나는 폭풍을 모른다. 그래서 나는 이것에 관해 정말로 말할 수 없습니다. 하지만 당신의 발췌 문장은 ** 스레드 세이프 싱글 톤이 아닙니다 **. 따라서 폭풍이 동기화에 대해 "좋아"하지 않는다고해도 코드는 동시 컨텍스트에서 사용될 때 문제를 만듭니다. – Fildor

답변

0

폭풍은 시스템으로 분배되므로 모든 병렬 실행 볼트에 대해 단일 공유 변수를 가질 수 없습니다. 단일 작업자 JVM 내에서 실행 프로그램에 대한 변수 만 공유 할 수 있습니다.

이렇게하려면 static 변수를 만들고 공유/정적 개체 인스턴스를 사용하여 해당 초기화를 동기화해야합니다.