我現在的思路是在我的application中配置兩個數據庫
利用aop自動切換數據庫
<bean id="dataSource" class="com.staples.*.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="dataSourceOne" value-ref=" dataSourceOne " />
<entry key="dataSourceTwo" value-ref=" dataSourceTwo " />
</map>
</property>
<property name="defaultTargetDataSource" ref=" dataSourceOne " />
</bean>
<bean id="dataSourceInterceptor" class="com.staples.*. DataSourceInterceptor " />
<aop:config>
<aop:aspect id="dataSourceAspect" ref="dataSourceInterceptor">
<aop:pointcut id="dsOracleOne " expression="execution(* com.controller.生產數據的controller.*.*(..))" />
<aop:pointcut id="dsOracleTwo" expression="execution(*com.service.日志的service.*.*(..))" />
<aop:before method="setdataSourceOne" pointcut-ref="dsOracleOne"/>
<aop:before method="setdataSourceTwo" pointcut-ref=" dsOracleTwo "/>
</aop:aspect>
</aop:config>
下面是我的數據庫切換方法
DynamicDataSource.Java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DatabaseContextHolder.getCustomerType();
}
}
DataSourceInterceptor.java
import org.aspectj.lang.JoinPoint;
public class DataSourceInterceptor {
public void setdataSourceMysql(JoinPoint jp) {
DatabaseContextHolder.setCustomerType("dataSourceOne");
}
public void setdataSourceOracle(JoinPoint jp) {
DatabaseContextHolder.setCustomerType("dataSourceTwo");
}
}
DatabaseContextHolder.java
public class DatabaseContextHolder {
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();
}
}
請問我可不可以這樣寫我的aop啊
我是為了實現日志和生產的數據源分離,而我在保存日志的時候都是直接在事務層調我日志的service,這樣可以實現嗎
我給你說個思路吧 你先讓一個數據源默認,然後根據請求的信息判斷要切換的數據源就行了 你這個配置其實就是按照我說的這樣的配置的 是可行的!