Spring and many Mybatis data sources

My applications use Spring3 + MyBatis3. I am trying to set several data sources for it. The setup is as follows:

<!-- 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> 

In the logs, I found this message:

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

I googled and looked in mybatis manuals, but could not find a way to configure multiple data sources using mybatis. Any ideas?

+4
source share
3 answers

the problem was that I should point directly to 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"/> 
+2
source

also resolved! just specify your factory bean in MapperScannerConfigurer: sqlSessionFactoryBeanName

First data source → → →>

 <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> 

Second data source → → →

 <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> 
+4
source

In a DAO implementation, use SqlSessionTemplate instead of SqlSessionDaoSupport . Inject bean db1SqlSessionTemplate or db2SqlSessionTemplate .

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

When expanding SqlSessionDaoSupport the Spring context does not know that you are using SqlSession .

0
source

Source: https://habr.com/ru/post/1336305/


All Articles