我们有一个带有单个数据库“dbMain”的应用程序,具有一组读写操作。
现在我们需要添加额外的数据库 db1-db10 用于只读操作,以便在 SomeServiceImpl 中使用。
问题是:
- 我需要在 SomeServiceImpl 使用几个 DAO(用于 dbMain 和 db1)
- 在 tx:annotation-driven 只能定义单个 transactionManager,@Transactional 将仅使用它进行操作。
- 有时我在 SomeServiceImpl 遇到 db-connection 泄漏,用于使用 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() {
...
}
...
}