2013-08-13 10 views
13

मैं स्प्रिंग और माइबेटिस के साथ काम कर रहा हूं और मेरे पास दो डेटाबेस हैं, पहले डेटाबेस के लिए कॉन्फ़िगरेशन सापेक्ष आसान था, लेकिन मैं वसंत और लेन-देन के साथ दूसरे डेटाबेस को काम नहीं कर सकता मेरी कोडमाइबेटिस स्प्रिंग एकाधिक डेटाबेस जावा कॉन्फ़िगरेशन

@Configuration 
@ComponentScan(basePackages = {"hernandez.service", "hernandez.dao"}) 
@EnableTransactionManagement 
@MapperScan(basePackages="hernandez.mapper") 
@Import(DbConfig2.class) 
public class AppConfig { 

@Bean(name = "dataSource") 
public DataSource dataSource() { 
    DriverManagerDataSource ds = new DriverManagerDataSource("com.mysql.jdbc.Driver", 
      "jdbc:mysql://localhost:3306/northwind", "root", ""); 
    return ds; 
} 

@Bean 
public SqlSessionFactoryBean sqlSessionFactory() { 
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); 
    factoryBean.setDataSource(dataSource()); 
    return factoryBean; 
} 

@Bean(name = "transactionManager") 
public PlatformTransactionManager transactionManager() { 
    return new DataSourceTransactionManager(dataSource()); 
} 
} 

@Configuration 
@MapperScan("loli.mapper") 
public class DbConfig2 { 
@Bean(name = "dataSource_2") 
public DataSource dataSource2() { 
    DriverManagerDataSource ds = new DriverManagerDataSource("com.mysql.jdbc.Driver", 
      "jdbc:mysql://localhost:3306/dmsolut_dmsms", "root", ""); 
    return ds; 
} 

@Bean 
public SqlSessionFactory sqlSessionFactory2() throws Exception{ 
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); 
    factoryBean.setDataSource(dataSource2()); 
    return factoryBean.getObject(); 
} 

@Bean(name = "transactionManager_2") 
public PlatformTransactionManager transactionManager() { 
    return new DataSourceTransactionManager(dataSource2()); 
} 
} 

है वहाँ एक रास्ता यह शुद्ध वसंत जावा विन्यास के साथ या कम से कम कुछ XML के साथ काम कर पाने के लिए है? माइबैटिस-स्प्रिंग प्रोजेक्ट

उत्तर

17

माइबैटिस के साथ मल्टी डेटा स्रोतों का उपयोग अभी मेरे प्रोजेक्ट में किया जाता है। यह एक उदाहरण है, अपने application.xml लिए जावा config उदाहरण के साथ

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> 
    <property name="url" value="${center.connectionURL}"/> 
    <property name="username" value="${userName}"/> 
    <property name="password" value="${password}"/> 
</bean> 

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="basePackage" value="com.xxx.dao.center"/> 
    <property name="sqlSessionFactoryBeanName" value="cneterSqlSessionFactory"/> 
</bean> 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" name="cneterSqlSessionFactory"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="mapperLocations" value="classpath*:mapperConfig/center/*.xml"/> 
    <property name="configLocation" value="classpath:mybatis-config.xml"/> 
</bean> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<!--center db end--> 
<!--exdb--> 
<bean id="dataSourceEx" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> 
    <property name="url" value="${ex.connectionURL}"/> 
    <property name="username" value="${userName}"/> 
    <property name="password" value="${password}"/> 
</bean> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="basePackage" value="com.xxx.dao.ex"/> 
    <property name="sqlSessionFactoryBeanName" value="exSqlSessionFactory"/> 
</bean> 
<bean id="sqlSessionFactoryEx" class="org.mybatis.spring.SqlSessionFactoryBean" name="exSqlSessionFactory"> 
    <property name="dataSource" ref="dataSourceEx"></property> 
    <property name="mapperLocations" value="classpath*:mapperConfig/ex/*.xml"/> 
    <property name="configLocation" value="classpath:mybatis-config.xml"/> 
</bean> 
<bean id="transactionManagerEx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSourceEx"/> 
</bean> 
+7

जावा कॉन्फ़िगरेशन का उपयोग कर ऐसा करने का कोई तरीका है? –

+0

मैंने अभी तक कोशिश नहीं की है। मैं केवल एक्सएमएल कॉन्फ़िगरेशन द्वारा वसंत के साथ mybatis का उपयोग करता हूं। –

10

जोड़ें जवाब हम अपने परियोजना में उपयोग जोड़ें:

import org.apache.ibatis.session.SqlSessionFactory; 
import org.apache.ibatis.type.JdbcType; 
import org.mybatis.spring.SqlSessionFactoryBean; 
import org.mybatis.spring.mapper.MapperScannerConfigurer; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.jdbc.datasource.DataSourceTransactionManager; 
import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import javax.sql.DataSource; 

@Configuration 
@ComponentScan(basePackages = "com.mycompany") 
@EnableTransactionManagement(proxyTargetClass = true) 
public class ApplicationConfig2 { 
    public static final String DATA_SOURCE_NAME_1 = "jdbc/dataSource1"; 
    public static final String DATA_SOURCE_NAME_2 = "jdbc/dataSource2"; 

    public static final String SQL_SESSION_FACTORY_NAME_1 = "sqlSessionFactory1"; 
    public static final String SQL_SESSION_FACTORY_NAME_2 = "sqlSessionFactory2"; 

    public static final String MAPPERS_PACKAGE_NAME_1 = "com.mycompany.mappers.dao1"; 
    public static final String MAPPERS_PACKAGE_NAME_2 = "com.mycompany.mappers.dao2"; 

    @Bean 
    public DataSource dataSource1() { 
     JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); 
     return dsLookup.getDataSource(DATA_SOURCE_NAME_1); 
    } 

    @Bean 
    public DataSource dataSource2() { 
     JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); 
     return dsLookup.getDataSource(DATA_SOURCE_NAME_2); 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(dataSource()); 
    } 


    @Bean(name = SQL_SESSION_FACTORY_NAME_1) 
    public SqlSessionFactory sqlSessionFactory1(DataSource dataSource1) throws Exception { 
     SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); 
     sqlSessionFactoryBean.setTypeHandlersPackage(DateTimeTypeHandler.class.getPackage().getName()); 
     sqlSessionFactoryBean.setDataSource(dataSource1); 
     SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject(); 
     sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true); 
     sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL); 
     return sqlSessionFactory; 
    } 

    @Bean(name = SQL_SESSION_FACTORY_NAME_2) 
    public SqlSessionFactory sqlSessionFactory2(DataSource dataSource2) throws Exception { 
     SqlSessionFactoryBean diSqlSessionFactoryBean = new SqlSessionFactoryBean(); 
     diSqlSessionFactoryBean.setTypeHandlersPackage(DateTimeTypeHandler.class.getPackage().getName()); 
     diSqlSessionFactoryBean.setDataSource(dataSource2); 
     SqlSessionFactory sqlSessionFactory = diSqlSessionFactoryBean.getObject(); 
     sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true); 
     sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL); 
     return sqlSessionFactory; 
    } 

    @Bean 
    public MapperScannerConfigurer mapperScannerConfigurer1() { 
     MapperScannerConfigurer configurer = new MapperScannerConfigurer(); 
     configurer.setBasePackage(MAPPERS_PACKAGE_NAME_1); 
     configurer.setSqlSessionFactoryBeanName(SQL_SESSION_FACTORY_NAME_1); 
     return configurer; 
    } 

    @Bean 
    public MapperScannerConfigurer mapperScannerConfigurer2() { 
     MapperScannerConfigurer configurer = new MapperScannerConfigurer(); 
     configurer.setBasePackage(MAPPERS_PACKAGE_NAME_2); 
     configurer.setSqlSessionFactoryBeanName(SQL_SESSION_FACTORY_NAME_2); 
     return configurer; 
    } 
} 
+1

लेनदेन प्रबंधक के बारे में कैसे? किस डेटासोर्स का उपयोग करना चाहिए? –

+0

कभी-कभी आपको प्राथमिक स्रोत के रूप में डेटासोर्स, लेनदेन प्रबंधक, और एसक्लसेशन फैक्ट्री असाइन करने की आवश्यकता हो सकती है। –

2

मेरे अनुभव में, आप भी से एक के लिए @Primary जोड़ना चाहिए DataSource सेम। अन्यथा यह NoUniqueBeanDefinitionException फेंक देगा।

@Bean 
@Primary 
public DataSource dataSource1() { 
    JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); 
    return dsLookup.getDataSource(DATA_SOURCE_NAME_1); 
} 

@Bean 
public DataSource dataSource2() { 
    JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); 
    return dsLookup.getDataSource(DATA_SOURCE_NAME_2); 
} 
1

आप इसे विस्तार और विधि determineCurrentLookupKey() अधिभावी द्वारा वसंत के AbstractRoutingDataSource उपयोग कर सकते हैं।

स्प्रिंग विन्यास

आप वसंत विन्यास में अलग datasource परिभाषित कर सकते हैं।

<!-- db2 data source --> 
<bean id="db2DataSource" class="com.ibm.db2.jdbc.app.DB2Driver"> 
    <property name="serverName" value="${db2.jdbc.serverName}" /> 
    <property name="portNumber" value="${db2.jdbc.portNumber}" /> 
    <property name="user" value="${db2.jdbc.username}" /> 
    <property name="password" value="${db2.jdbc.password}" /> 
    <property name="databaseName" value="${db2.jdbc.databaseName}" /> 
</bean> 

<!-- mysql data source --> 
<bean id="mysqlDataSource" class="com.mysql.jdbc.Driver"> 
    <property name="serverName" value="${mysql.jdbc.serverName}" /> 
    <property name="portNumber" value="${mysql.jdbc.portNumber}" /> 
    <property name="user" value="${mysql.jdbc.username}" /> 
    <property name="password" value="${mysql.jdbc.password}" /> 
    <property name="databaseName" value="${mysql.jdbc.databaseName}" /> 
</bean> 

एसोसिएट ग्राहक के साथ डेटा स्रोत:

जावा

package com.example; 

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 

public class CustomerRoutingDataSource extends AbstractRoutingDataSource { 

@Bean 
CustomerContextHolder context; 

@Override 
protected Object determineCurrentLookupKey() { 
    return context.getCustomerType(); 
} 
} 

मूल रूप से, प्रत्येक अनुरोध उसके संदर्भ होगा। मैप किए गए कुंजी का उपयोग कर अनुरोध के साथ आप datasource को जोड़ सकते हैं। आप ऊपर कहा गया है, हम आपके DaoImpl में इसी sessionFactory देने की आवश्यकता यहाँ dynamic-datasource-routing

0

<bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource1" /> 
    <property name="configLocation"> 
     <value>classpath:com/dtcc/dao/impl/DaoSqlMapConfig_MyBatis1.xml</value> 
    </property> 
    <property name="transactionFactory"> 
     <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" /> 
    </property> 
    <property name="mapperLocations" value="classpath*:com/dtcc/dao/impl/DaoEmfMyBatis.sp.xml"/> 
</bean> 
<bean id="sqlSession1" class="org.mybatis.spring.SqlSessionTemplate"> 
    <constructor-arg index="0" ref="sqlSessionFactory1" /> 
</bean> 
<!-- MyBatis Changes Ends --> 

<bean id="daoEmf" class="com.dtcc.dao.DaoEmfImpl"> 
    <property name="connectionType"><ref local="com.dtcc.sharedservices.utils.resources.ConnTypes.IBM_DB2_CONNECTION" /></property> 
    <property name="jndiNameForLogging"><ref local="dataSourceName1" /></property> 
    <property name="sqlSessionTemplate"> <ref local="sqlSession1" /></property> 
    <property name="applicationLog"><ref local="appLog" /></property> 
</bean> 

अधिक जानकारी प्राप्त कर सकते हैं। यदि आपके पास एक से अधिक सत्र फैक्ट्री हैं तो आप अपने दाओइम्पल क्लास में SqlSessionTemplate को स्वत: नहीं कर सकते हैं। प्रत्येक सत्र कारखाने के लिए अद्वितीय नाम दें और इसे अपने संबंधित दाओइम्पल क्लास में मैप करें। आपको बस इतना करना है कि DaoImpl क्लास में सेटर विधि के साथ SqlSessionTemplate के लिए ऑब्जेक्ट बनाना है और आप नीचे दिए गए sqlSessionTemplate ऑब्जेक्ट का उपयोग करके अपना डीबी कॉल कर सकते हैं, this.sqlSessionTemplate.selectList ("ProcedureID", पैरामीटर);

संबंधित मुद्दे