読み取りおよび書き込み操作のセットを備えた単一のデータベース「dbMain」を備えたアプリがあります。
次に、SomeServiceImplで使用するために、読み取り専用操作用に追加のデータベースdb1-db10を使用して追加する必要があります。
問題は:
- SomeServiceImplでいくつかのDAO(dbMainおよびdb1用)を使用する必要があります
- tx:annotation-drivenで定義できるtransactionManagerは1つだけであり、@Transactionalはそれだけで動作します。
- db1DAOを使用した操作で、SomeServiceImplでdb接続リークが発生することがありました。少なくとも@PostConstructinit(){...}
本当に、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() {
...
}
...
}