实例介绍
通过SpringAop实现多数据源的动态切换 并采用Druid连接池,可扩展继续增加数据库配置。
commons-log. connection-logger-name: stat, wall, log4j 通过 connectProperties属性来打开 mergeS1功能;慢SQL记录 connectionProperties druid. stat. mergeSql-=true: druid. stat. slowSqIMillis-5000 合并多个 Drui dAtasOurce的监控数据 useGlobal DataSourcestat: true 3:配置数据源 水水 *多数据源配置类配置了两个数据源 @Configuration ublic class DataSourceConfig 从配置文件配置数据源 米@ return @Bean (name-datasourcel @ConfigurationProperties(prefix=spring datasource. druid db1")// lapplication. properteIs中对应属性的前缀 public dataSource dataSource return Data lder, create. build O return new DruidDataSource o *从配置文件巸置数据源 米@ return @Bean(name=datasource") @ConfigurationProperties (prefix-spring datasource druid. db2")// lapplication. properites中对应属性的前缀 public DataSource dataSource2o[ return DataSourceBuilder create. build return new DruidDataSource( @Bean (name-datasource3") @ConfigurationProperties (prefix- spring datasource. druiddb3")// application. properites中对应属性的前缀 public DataSource dataSource( return DataSourceBuilder create(. build return new DruidDataSourceo 半 动态数据源进行数据源的切换 米@ return @ rimary @Bean(name dynamicDataSource") public DataSource dynamicDataSource( I DynamicDataSource dynamicDataSource- new DynamicDataSource o /默认数据源 dynamicDataSource. setDefaultTarget DataSource(dataSource1() /配置多数据源 Map object, Object> dsMap new HashMap() dsMap. put(datasource", dataSource() dsMap. put(datasourcc2", dataSourcc2O) dsMap, put(datasource", dataSource() //将多数据源添加到数据源池中 dynamicDataSource. setTargetDataSources(ds Map) return dynamicDataSource 米半 米通过动态数据源配置 sqlsessionfactory @param dynamicDataSource 米@ return 米@ throws Exception @Bean public SqlSessionFactory sqlSessionFactory(QQualifier(" dynamicDataSource DataSource dynamicDataSource) throws Exception t SqlSessionFactory Bean factory Bean- new SqlsessionFactory Bean( factoryBean. setDataSource(dynamicDataSource) factory Bean. setTypeAliasesPackage("com. trs bigscreen mapper factory Bean. sctMapperLocations( new thMatchingResourcePatternResolvero. getResources( classpath: mapping/* xm1 ) return factory Bean getObject o 通过动态数据源配置 sqIsessionTemplate k Paran sqlsessionFactory 米@ return 米@ throws Exception bEan public SqlsessionTemplate sql Session Template(SqlsessionFactory sqlSession Factory) return new SalScssionTemplatc(sqlSession Factory 米冰 配置事务管理器 k @param dynamicDataSource 米@ return B edn public DataSourceTransactionManager transactionManager((Qualifier(dynamicDataSource" DataSource dynamicDataSource)t return new DataSourceTransactionManager(dynamicDataSource 4:创建动态数据源获取类 public class DynamicDataSource extends Abstract RoutingDataSource @Override protected Object determine CurrentLookupKeyo ystem. o. printIn("数据源为"+ DataSourceContextholder. getDB(); return DataSourceContextHolder getDB O 5:创建数据源管理切换类 ublic class DataSourceContextHolder 半半 默认数据源 public static final String 0/0s-datasourcel private static final ThreadLocal String/ extOl new readLocal>O /设置数据源名 public static void setDB(String dbType) System.. println("切换到{" diType"}数据源") contextholdez. set(db Type) /获取数据源名 public static String getDB o( return extHolder. getO) /清除数据源名 public static void clearDBO e, remove 6: Druid配置监控 Druid监控配置 @Configuration public class DruidMoniterConfig t //1、配置一个管理后台的 Servlet @Bean public ServletRegistrationBean statViewServleto i ServletRegistrationBean bean new ServletRegistration Bean(new StatViewServlet(,"/druid/*") Map<String, String initParams new HashMapsO initParams. put(" loginUsername,admin) initParams. put(loginPassword"admin") initParams.put("a1low",");//默认就是允许所有访问 nitParams.put("deny","192.168.15.21");//黑名单的IP bean. setInitParameters (initParams) return bean //2、配置一个web监控的 filter @Be public FilterRegistrationBean webStatFiltero FilterRegistrationBean bean- new FilterRegistrationBean( bean. setFilter (new WebStatFilter() Map< String, String initParams new HashMap>O initParams. put("exclusions",*. js, * css, /druid/*) bean.setInitParameters(initParams) bean. setUrlPatterns(Arrays. asList(/*")) return bean 7:定义注解用于指定数据源 来数据源切换注解 @Retention (RetentionPolicy RN/) @Target(ElementType METHOL, ElementType TP )) public (interface DS tring value default"datasource 8:定义切面进行动态切换 半半 动态数据源切面 @Order(0)// Spring的事务与数据源是绑定的。也就说,如果你开启了事务,那么数 居源已经绑定了。那么这个时候,你在去切换数据源就无效了。也就是说要想有效,那么 久要在事务开启之前就把数据源切换好 aSpect @Component public class DynamicDataSourceAspect @Before("@annotat ion(ds) public void before SwitchDS ( JoinPoint point, DS ds)t System. out. println("进入切面了 //获得当前访问的 class Class(?) className- point. getTargetO. getClass o //获得访问的方法名 String methodName- point. getSignature (. getName o //得到方法的参数的类型 Classl」 argClass ((MethodSignature)point getSignature ().getParameterTypeso) String dataSource DataSource ContextHolder. EFAL7DS try /得到访问的方法对象 Method method- class Name. getMethod(methodName, argClass /判断是否存在@DS注解 if(method. isAnnotationPresent(DS. class))i DS annotation- method. getAnnotation(DS. class) //取出注解中的数据源名 dataSource- annotation value I catch (Exception e)I e print StackTraceo /切换数据源 DataSourceContextHolder. setDB(dataSource @After( @annotation(com. trs bigscreen annotation DS) public void afterSwitchDS (JoinPoint point)( DataSourceContextHoldcr. clcarDBO 9:用法 賑务 Transactional TestMoreData Service Irp1 Tes-MoreData Service i QAutcwired rate TestA stla PDS( datasource blic List Test> selectTestByAl1([ return tes= Mappe=. selectAllTest( oDS( datasource") public List(Test) selectTestByAll2o f return test Mapper. selectAllTest() 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论