2014-01-21 1 views
3

클라이언트 측에서 전달되는 고객 ID에 따라 다른 데이터베이스에 연결해야하는 응용 프로그램에서 작업하고 있습니다. 모든 데이터베이스의 스키마는 동일합니다. 그것은 멀티 테넌트 (multi-tenant) 어플리케이션의 일종입니다. 얼마나 많은 고객이 있을지 모르기 때문에 xml 구성을 사용하여 정적으로 데이터 소스를 만들 수 없기 때문에 수동으로 데이터 소스를 만들어야합니다.수동으로 생성 된 여러 데이터 소스에 대한 트랜잭션 관리

우리는 데이터베이스에 연결하기 위해 Spring JdbcTemplate을 사용하고 연결 매개 변수는 응용 프로그램에 대한 구성을 보유하는 다른 데이터베이스에서 온 것입니다. 데이터베이스에 제대로 연결할 수 있지만 트랜잭션에서 메소드 호출이 발생하지 않습니다. 는 다음 하나의 데이터베이스에 대한 데이터베이스 연결을 수행하는 코드 조각 내가 여러 데이터베이스를 위해 그것을 확장 할 거라고 :

BasicDataSource datasource = new BasicDataSource(); 
// set database connection params 
.... 
// create jdbcTemplate, 
jdbcTemplate = new JdbcTemplate(datasource); 
// create transaction managers 
PlatformTransactionManager txManager = new DataSourceTransactionManager(datasource); 

내 생각은 수동 트랜잭션 관리자를 작성하고 어떻게 든 봄의 용기에 결합하는 것입니다 @Transactional 어노테이션이있는 모든 메소드/클래스는이 트랜잭션 관리자를 사용할 수 있습니다. @transactional을 가진 모든 메소드/클래스가이 트랜잭션 관리자를 사용할 수 있도록 txManager를 바인드하는 방법을 설명 할 수 없습니다. 이 방법이 올바른지, 모든 데이터 소스에 대해 트랜잭션 관리자를 작성해야하는지 확신 할 수 없습니다. 트랜잭션을 여러 데이터베이스로 확장하지 않으려 고하지만 모든 서비스 메소드 호출이 트랜잭션에 있어야합니다. 참고 : 모든 서비스 클래스에는 @Component 및 @Transactional 주석이 있습니다.

올바른 방법으로 문제를 해결하고 있습니까?

+0

가능한 http://stackoverflow.com/questions/12641666/springs-jdbctemplate-and-transactions –

+0

@PradeepKrKaushal 중복은, 당신의 의견을 주셔서 감사합니다,하지만 난 게시하기 전에 그 질문을 보았다. TransactionTemplate을 사용하는 것은 효율적인 옵션이 아닙니다. 왜냐하면 많은 serivce 클래스의 메소드와 모든 메소드가 TransactionTemplate을 사용하여 랩되어야하기 때문입니다. 내가 받아 들인 대답의 세 번째 단락에서 언급 한 것과 비슷한 솔루션을 찾고 있었지만 그것을하는 방법을 찾을 수 없었습니다. – jayendrap

답변

0

나는 다음과 같은 생각합니다 answer 당신이 찾고있는 것을 제공합니다. 그렇지 않으면 전역 트랜잭션 관리자가 필요합니다. 전역 트랜잭션 관리자는 JEE 컨테이너와 함께 제공되거나 Atomikos와 같은 트랜잭션 관리자가 독립형으로 제공 할 수 있습니다. Spring documentation 모두 커버

0

스프링의 AbstractRoutingDatasource를 사용할 수 있습니다.

아래 링크를 확인하십시오. AbstractRoutingDatasource가 설명됩니다. 선택한 언어에 따라 데이터베이스가 동적으로 변경됩니다.

Spring AbstractRoutingDatasource

관련 문제