Spring+Hibernate框架上Mysql读写分离、主从数据库配置(下)
Spring+Hibernate框架下Mysql读写分离、主从数据库配置(上)转载:http://lujia35.iteye.com/blog/969466介绍
Spring+Hibernate框架下Mysql读写分离、主从数据库配置(上)
转载:http://lujia35.iteye.com/blog/969466
介绍下mysql数据库读写分离在spring,hibernate框架下的配置。?
1.mysql连接配置文件jdbc.properties?
master.*.*表示主数据库连接参数,负责增,删,改;?
slave.*.*表示从数据库连接参数,只负责读取;?
jdbc.properties
?
Java代码??
- master.jdbc.driverClassName=com.mysql.jdbc.Driver??
- master.jdbc.url=********??
- master.jdbc.username=********??
- master.jdbc.password=********??
- ??
- slave.jdbc.driverClassName=com.mysql.jdbc.Driver??
- slave.jdbc.url=********??
- slave.jdbc.username=********??
- slave.jdbc.password=********??
把**改成你所需的连接参数;?
2.配置AOP切面类 DataSourceAdvice.java?
Java代码??
- 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");??
- ????}??
- ??
- }??
数据源选择类 DataSourceSwitcher.java?
Java代码??
- 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();??
- ????}??
- }??
DynamicDataSource.java数据源动态切换类?
Java代码??
- package?com.company.datasource;??
- ??
- import?org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;??
- ??
- public?class?DynamicDataSource?extends?AbstractRoutingDataSource?{??
- ??
- ????@Override??
- ????protected?Object?determineCurrentLookupKey()?{??
- ????????return?DataSourceSwitcher.getDataSource();??
- ????}??
- ??
- }??
下面配置spring applicationContext.xml文件?(Spring+Hibernate框架下Mysql读写分离、主从数据库配置(下))