本来项目是一个数据源(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会自动在默认数据库里建表,导致第一个数据库里会多出空表。
暂存。