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 변수의 초기화를 한 번만 수행하는 방법입니다.
그래서 실제로는 threadsafe [Singleton] (http://stackoverflow.com/documentation/java/130/singletons#t=201608121142368276512)를 원하십니까? – Fildor
예! 나는 지금까지 2 개의 솔루션을 사용했다 : 하나는 java.util.concurrent이고 다른 하나는 동기화이다. 둘 다 평범한 자바 코드로 잘 작동하지만 스톰의 경우에는 작동하지 않습니다. Storm은 다른 멀티 스레딩 메커니즘을 따르고 있습니까? –
사실, 나는 폭풍을 모른다. 그래서 나는 이것에 관해 정말로 말할 수 없습니다. 하지만 당신의 발췌 문장은 ** 스레드 세이프 싱글 톤이 아닙니다 **. 따라서 폭풍이 동기화에 대해 "좋아"하지 않는다고해도 코드는 동시 컨텍스트에서 사용될 때 문제를 만듭니다. – Fildor