Multi DataSources: 1 RW + много RO - PullRequest
       29

Multi DataSources: 1 RW + много RO

1 голос
/ 26 декабря 2011

У нас есть приложение с одной базой данных 'dbMain', с набором операций чтения и записи.

Теперь нам нужно добавить дополнительные базы данных db1-db10 для операций только для чтения, для использования в SomeServiceImpl.

Проблема в следующем:

  • Мне нужно использовать несколько DAO (для dbMain и db1) в SomeServiceImpl
  • в tx можно определить только одну транзакциюManager: annotation-Управляется и @Transactional будет работать только с ним.
  • иногда я получал утечки db-соединения в SomeServiceImpl для операций с db1DAO.По крайней мере, в @PostConstruct init () {...}

Действительно, не хотите использовать JTA.Как правильно настроить такую ​​среду?

<tx:annotation-driven transaction-manager="dbMainTransactionManager"/>

<bean id="dbMainSessionFactory"
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dbMainDataSource"/>
...
</bean>
<bean id="dbMainTransactionManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="dbMainSessionFactory"/>
...
</bean>

@Repository
public class DBMainDAOImpl extends HibernateDaoSupport implements DBMainDAO {
    @Resource(name = "dbMainSessionFactory")
    protected void init(SessionFactory sessionFactory) throws Exception {
        setSessionFactory(sessionFactory);
    }
...
}

@Transactional
@Service
public class SomeServiceImpl implements SomeService {
    @Autowired
    private DBMainDAO dbMainDAO;
...
}

Дополнительные базы данных:

<bean id="db1SessionFactory"
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="db1DataSource"/>
...
</bean>
<bean id="db1TransactionManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="db1SessionFactory"/>
...
</bean>

public class DB1DAOImpl extends HibernateDaoSupport implements DB1DAO {
    @Resource(name = "db1SessionFactory")
    protected void init(SessionFactory sessionFactory) throws Exception {
        setSessionFactory(sessionFactory);
    }
...
}

@Transactional
public class SomeServiceImpl implements SomeService {
    @Autowired
    private DBMainDAO dbMainDAO;
    @Autowired
    private DB1DAO db1DAO;
    ...
    @Autowired
    private DB10DAO db10DAO;

    @PostConstruct init() {
    ...
    }
...
}
...