今天尝试了单独把日志分库管理,这样在一个项目中使用了两个数据源,通过在网上搜罗资料,最终成功了,记录一下。
首先配置jdbc.properties(以下全部为基本配置)
db.driverClass=com.mysql.jdbc.Driver db1.url=jdbc:mysql://localhost:3306/auge_new?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true db2.url=jdbc:mysql://localhost:3306/auge_log?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true db.username=root db.password=123456
然后配置datasource-config.xml(可以直接在spring-mybatis.xml中配置,在这里我摘取出来了)
<!-- 数据库配置文件位置 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 数据源1-->
<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="driverClassName" value="${db.driverClass}"/>
<property name="url" value="${db1.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
<!-- 数据源2 -->
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="driverClassName" value="${db.driverClass}"/>
<property name="url" value="${db2.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
<bean id="dynamicDataSource" class="com.xiaodou.park.interceptors.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<!--指定lookupKey和与之对应的数据源 -->
<entry key="dataSource1" value-ref="dataSource1"></entry>
<entry key="dataSource2" value-ref="dataSource2"></entry>
</map>
</property>
<!--这里可以指定默认的数据源-->
<property name="defaultTargetDataSource" ref="dataSource1"/>
</bean>
下面为DynamicDataSource类和DynamicDataSourceHolder类。
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // 从自定义的位置获取数据源标识 return DynamicDataSourceHolder.getDataSource(); } }
public class DynamicDataSourceHolder { private static final ThreadLocal <String> THREAD_DATA_SOURCE = new ThreadLocal <String>(); public static String getDataSource(){ return THREAD_DATA_SOURCE.get(); } public static void setDataSource(String dataSource){ THREAD_DATA_SOURCE.set(dataSource); } public static void clearDataSource(){ THREAD_DATA_SOURCE.remove(); } }
然后在spring-mybatis.xml中配置工厂类和事物处理。
<import resource="datasource-config.xml" /> <!-- 数据源 会话工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis-config.xml" /> <property name="dataSource" ref="dynamicDataSource" /> </bean> <!-- 数据源 映射 --> <!--<context:component-scan base-package="com.wechat.xiaodou.mapper"/>--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <!--可用,或者;分割多个扫描的包--> <property name="basePackage" value="com.xiaodou.park.mapper"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="dynamicDataSource"/> </property> </bean>
配置好之后,默认使用dataSource1数据源,若想使用dataSource2数据源,如下代码所示:
DynamicDataSourceHolder.setDataSource("dataSource2"); errorLogService.insertSelective(errorLog);暂时就这样了,后续代码开发后再记录。