AOP切面实现动态数据源(含代码)

来源:互联网 发布:广州cnc编程招聘 编辑:程序博客网 时间:2024/05/21 08:40

在service同级目录增加一个folder ,将以下三个官方提供的类添至其中:
1 DatasourceAspect.java

import org.apache.commons.lang3.StringUtils;import org.aspectj.lang.JoinPoint;/** * 定义数据源的AOP切面,通过该Service的方法名判断是应该走读库还是写库 * */public class DataSourceAspect {    /**     * 在进入Service方法之前执行     *      * @param point 切面对象     */    public void before(JoinPoint point) {        // 获取到当前执行的方法名        String methodName = point.getSignature().getName();        if (isSlave(methodName)) {            // 标记为读库            DynamicDataSourceHolder.markSlave();        } else {            // 标记为写库            DynamicDataSourceHolder.markMaster();        }    }    /**     * 判断是否为读库     *      * @param methodName     * @return     */    private Boolean isSlave(String methodName) {        // 方法名以query、find、get开头的方法名走从库        return StringUtils.startsWithAny(methodName, "query", "find", "get");    }}

2 DynamicDataSource.java

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/** * 定义动态数据源,实现通过集成Spring提供的AbstractRoutingDataSource,只需要实现determineCurrentLookupKey方法即可 *  * 由于DynamicDataSource是单例的,线程不安全的,所以采用ThreadLocal保证线程安全,由DynamicDataSourceHolder完成。 * */public class DynamicDataSource extends AbstractRoutingDataSource{    @Override    protected Object determineCurrentLookupKey() {        // 使用DynamicDataSourceHolder保证线程安全,并且得到当前线程中的数据源key        return DynamicDataSourceHolder.getDataSourceKey();    }}

3 DynamicDataSourceHolder.java

public class DynamicDataSourceHolder {    //写库对应的数据源key    private static final String MASTER = "master";    //读库对应的数据源key    private static final String SLAVE = "slave";    //使用ThreadLocal记录当前线程的数据源key    private static final ThreadLocal<String> holder = new ThreadLocal<String>();    /**     * 设置数据源key     * @param key     */    public static void putDataSourceKey(String key) {        holder.set(key);    }    /**     * 获取数据源key     * @return     */    public static String getDataSourceKey() {        return holder.get();    }    /**     * 标记写库     */    public static void markMaster(){        putDataSourceKey(MASTER);    }    /**     * 标记读库     */    public static void markSlave(){        putDataSourceKey(SLAVE);    }}

修改 jdbc.properties

#######################  DB Connection Config  ##########################----------------- DB Type -----------------#the database of the application:mysql|sqlserver|oracledatabaseType=mysql#databaseType=sqlserver#databaseType=oracle###----------------- MySQL5+ -----------------jdbc.master.driverClassName=com.mysql.jdbc.Driverjdbc.master.url=jdbc:mysql://192.168.137.141:3306/demo?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf-8jdbc.master.username=rootjdbc.master.password=rootjdbc.slave.driverClassName=com.mysql.jdbc.Driverjdbc.slave.url=jdbc:mysql://192.168.137.128:3308/demo?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf-8jdbc.slave.username=rootjdbc.slave.password=roothibernate.dialect=org.hibernate.dialect.MySQLDialect###----------------- SqlServer2005+ -----------------#jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver#jdbc.url=jdbc:sqlserver://localhost:1433;DatabaseName=sampledb#jdbc.username=xxx#jdbc.password=xxx#hibernate.dialect=org.hibernate.dialect.SQLServerDialect###----------------- Oracle10g+ -----------------#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver#jdbc.url=jdbc:oracle:thin:@localhost:1521:orac10g#jdbc.username=scott#jdbc.password=scott123#hibernate.dialect=org.hibernate.dialect.OracleDialect###----------------- JNDI -----------------#jndi.name=myjndi123###----------------- Hibernate -----------------hibernate.show_sql=truehibernate.format_sql=truehibernate.hbm2ddl.auto=updatehibernate.jdbc.fetch_size=100hibernate.jdbc.batch_size=20hibernate.cache.use_second_level_cache=truehibernate.cache.use_query_cache=truehibernate.memcached.cacheTimeSeconds=10800#Hibernate4hibernate.cache.region.factory_class=org.hibernate.cache.EhCacheRegionFactory#Hibernate3#hibernate.cache.region.factory_class=org.hibernate.cache.EhCacheProvider###----------------- C3P0 -----------------c3p0.maxPoolSize=300c3p0.minPoolSize=1c3p0.initialPoolSize=1c3p0.maxIdleTime=60c3p0.acquireIncrement=5c3p0.idleConnectionTestPeriod=60###----------------- DBCP -----------------dbcp.maxActive=50dbcp.maxIdle=50dbcp.minIdle=1dbcp.maxWait=10000dbcp.initialSize=1
0 0
原创粉丝点击