2011-01-20 93 views
4

我的應用程序使用Spring3 + MyBatis3。我正在嘗試爲它設置多個數據源。設置的樣子:Spring和Mybatis多個數據源設置

<!-- db1 setup--> 
<bean id="db1SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" 
    p:configLocation="WEB-INF/mybatis/sqlMapConfig.xml" 
    p:dataSource-ref="db1DataSource" /> 
<bean id="db1SqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 
    <constructor-arg ref="db1SqlSessionFactory"/> 
</bean> 
<!-- db2 setup --> 
<bean id="db2SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" 
    p:configLocation="WEB-INF/mybatis/sqlMapConfig.xml" 
    p:dataSource-ref="db2DataSource" /> 
<bean id="db2SqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 
    <constructor-arg ref="db2SqlSessionFactory"/> 
</bean> 

在日誌中,我發現這條消息:

No unique bean of type [org.apache.ibatis.session.SqlSessionFactory] is defined: expected single matching bean but found 2: [db1SqlSessionFactory, db2SqlSessionFactory] 

我一派,看着MyBatis的手冊,但無法找到辦法如何設置與MyBatis的多個數據源。 任何想法?

回答

2

解決了,問題是,我必須直接指定參考的SqlSessionFactory

<bean id="myDao" class="org.mybatis.spring.mapper.MapperFactoryBean" 
    p:sqlSessionTemplate-ref="db1SqlSessionTemplate" 
    p:mapperInterface="my.project.domain.dao.MyDao" 
    p:sqlSessionFactory-ref="db1SqlSessionFactory"/> 
+0

您不應該同時設置模板和工廠。這是與MyBatis-Spring 1.0最終版本嗎?如果沒有,您可以升級並嘗試只設置SqlSessionTemplate值嗎? – AngerClown 2011-01-20 19:57:45

4

也解決了!剛纔提到你的工廠bean在MapperScannerConfigurer:sqlSessionFactoryBeanName

第一個數據源>>>>>>>

<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 

<bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource1"/> 
</bean> 

<bean id="MapperScannerConfigurer1" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
     <property name="basePackage" value="com.package.p1"/> 
     <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory1"/> 
    </bean> 

第二個數據源>>>>>>

<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean"> 
      <property name="dataSource" ref="dataSource2"/> 
    </bean> 
<bean id="MapperScannerConfigurer1" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
      <property name="basePackage" value="com.package.p2"/> 
      <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"/> 
</bean> 
0

在DAO實現使用SqlSessionTemplate而不是SqlSessionDaoSupport。注入豆db1SqlSessionTemplatedb2SqlSessionTemplate

@Repository 
public class TestDaoImpl implements TestDao{ 
    @Autowired 
    private SqlSession db1SqlSessionTemplate; 
    ... 
    db1SqlSessionTemplate.selectList("testSelect"); 
    ... 
} 

當延長SqlSessionDaoSupport上下文Spring不知道你用SqlSession