클라이언트 측에서 전달되는 고객 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 주석이 있습니다.
올바른 방법으로 문제를 해결하고 있습니까?
가능한 http://stackoverflow.com/questions/12641666/springs-jdbctemplate-and-transactions –
@PradeepKrKaushal 중복은, 당신의 의견을 주셔서 감사합니다,하지만 난 게시하기 전에 그 질문을 보았다. TransactionTemplate을 사용하는 것은 효율적인 옵션이 아닙니다. 왜냐하면 많은 serivce 클래스의 메소드와 모든 메소드가 TransactionTemplate을 사용하여 랩되어야하기 때문입니다. 내가 받아 들인 대답의 세 번째 단락에서 언급 한 것과 비슷한 솔루션을 찾고 있었지만 그것을하는 방법을 찾을 수 없었습니다. – jayendrap