Spring MVC 配置多数据源

本来项目是一个数据源(Mysql),因为业务需求,需要添加Oracle数据源

查了很多资料之后综合了一下

环境:spring 3.0

下面是spring配置


配置两个BasicDataSource:dataSourceMySql,dataSourceOra

<bean id="dataSourceMySql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://url:8192/database"></property>
        <property name="username" value="user"></property>
        <property name="password" value="pass"></property>
</bean>

<bean id="dataSourceOra" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
        <property name="url" value="jdbc:oracle:thin:@//url:1521/database"></property>
        <property name="username" value="user"></property>
        <property name="password" value="pass"></property>
</bean>


配置一个DynamicDataSource:dataSource

<bean id="dataSource" class="com.***.DynamicDataSource">
     <!-- 通过key-value的形式来关联数据源 -->
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry value-ref="dataSourceMySql" key="dataSourceMySql"></entry>
                <entry value-ref="dataSourceOra" key="dataSourceOra"></entry>
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="dataSourceMySql" >
        </property>
</bean>


配置一个SessionFactory

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="packagesToScan">
            <list>
                <value>com.**.model</value>
                <value>com.**.modelora</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLDialect
                </prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.jdbc.batch_size">100</prop>
                <prop key="hiberante.cache.use_second_level_cache">false</prop>
            </props>
        </property>
</bean>

 

DynamicDataSource实现

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

public class DynamicDataSource extends AbstractRoutingDataSource{
	public static final String DATA_SOURCE_MYSQL = "dataSourceMySql";
  	public static final String DATA_SOURCE_ORA = "dataSourceOra";
 	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

        public static void setCustomerType(String customerType) {
		contextHolder.set(customerType);
	}

	public static String getCustomerType() {
		return contextHolder.get();
	}

	public static void clearCustomerType() {
		contextHolder.remove();
	}

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



最后一步,在进入数据库操作前加上

            DynamicDataSource.setCustomerType(DynamicDataSource.DATA_SOURCE_MYSQL);

或者   

            DynamicDataSource.setCustomerType(DynamicDataSource.DATA_SOURCE_ORA);


目前有一个问题,scan出来的model(不管是第一张表的还是第二张表的)通过hibernate会自动在默认数据库里建表,导致第一个数据库里会多出空表。

暂存。


 

猜你喜欢

转载自blog.csdn.net/u010113247/article/details/51065761