日期:2014-05-16 浏览次数:20542 次
master.jdbc.driverclassname=com.mysql.jdbc.drivermaster.jdbc.url=********master.jdbc.username=********master.jdbc.password=********slave.jdbc.driverclassname=com.mysql.jdbc.driverslave.jdbc.url=********slave.jdbc.username=********slave.jdbc.password=********把**改成你所需的连接参数;
import java.lang.reflect.method;import org.springframework.aop.afterreturningadvice;import org.springframework.aop.methodbeforeadvice;import org.springframework.aop.throwsadvice;import com.company.datasource.datasourceswitcher;public class datasourceadvice implements methodbeforeadvice, afterreturningadvice, throwsadvice { // service方法执行之前被调用 public void before(method method, object[] args, object target) throws throwable { system.out.println("切入点: " + target.getclass().getname() + "类中" + method.getname() + "方法"); if(method.getname().startswith("add") || method.getname().startswith("create") || method.getname().startswith("save") || method.getname().startswith("edit") || method.getname().startswith("update") || method.getname().startswith("delete") || method.getname().startswith("remove")){ system.out.println("切换到: master"); datasourceswitcher.setmaster(); } else { system.out.println("切换到: slave"); datasourceswitcher.setslave(); } } // service方法执行完之后被调用 public void afterreturning(object arg0, method method, object[] args, object target) throws throwable { } // 抛出exception之后被调用 public void afterthrowing(method method, object[] args, object target, exception ex) throws throwable { datasourceswitcher.setslave(); system.out.println("出现异常,切换到: slave"); }}
package com.company.datasource;import org.springframework.util.assert;public class datasourceswitcher { @suppresswarnings("rawtypes") private static final threadlocal contextholder = new threadlocal(); @suppresswarnings("unchecked") public static void setdatasource(string datasource) { assert.notnull(datasource, "datasource cannot be null"); contextholder.set(datasource); } public static void setmaster(){ cleardatasource(); } public static void setslave() { setdatasource("slave"); } public static string getdatasource() { return (string) contextholder.get(); } public static void cleardatasource() { contextholder.remove(); }}
package com.company.datasource;import org.springframework.jdbc.datasource.lookup.abstractroutingdatasource;public class dynamicdatasource extends abstractroutingdatasource { @override protected object determinecurrentlookupkey() { return datasourceswitcher.getdatasource(); }}
<?xml version="1.0" encoding="utf-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config /> <!-- 自动加载service dao action --> <context:component-scan base-package="