您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Spring动态创建,加载,使用多数据源
Spring动态创建,加载,使用多数据源发表于2年前(2014-02-2618:00)阅读(2970)|评论(2)41人收藏此文章,我要收藏赞19月19日成都OSC源创会正在报名,送机械键盘和开源无码内裤摘要项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源。项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源。例如在一个spring和hibernate的框架的项目中,我们在spring配置中往往是配置一个dataSource来连接数据库,然后绑定给sessionFactory,在dao层代码中再指定sessionFactory来进行数据库操作。正如上图所示,每一块都是指定绑死的,如果是多个数据源,也只能是下图中那种方式。可看出在Dao层代码中写死了两个SessionFactory,这样日后如果再多一个数据源,还要改代码添加一个SessionFactory,显然这并不符合开闭原则。那么正确的做法应该是先说一下我的思路:首先做一个创建数据源配置文件的类,专门用于创建数据源xml配置,叫ConfigFileCreator.java其次,编写一个动态加载刚才创建的配置文件的类,叫DynamicLoadBean.java。至此,创建的数据源到内存中已经完成。第三,重点编写这个DynamicDataSource.java,该类主要是用来实现动态切换数据源,并通知容器。在这一块我选择了修改,AbstractRoutingDataSource.java,编写一个支持添加数据源对象的方法publicvoidaddDataSource(Objectkey,ObjectdataSource)第四,写例子来测试实现过程如下:1.bean.xml配置文件[html]viewplaincopy1.?12345678?xmlversion=1.0encoding=UTF-8?beansxmlns=:xsi=:tx=:context=:schemaLocation=://://://://://!--自动扫描与装配bean--context:component-scanbase-package=qilin/context:component-scan!--使用外部的配置文件--context:property-placeholderlocation=classpath:jdbc.properties/beanid=defaultDataSourceclass=com.mchange.v2.c3p0.ComboPooledDataSource!--数据库连接信息--propertyname=jdbcUrlvalue=${jdbcUrl}/propertypropertyname=driverClassvalue=${driverClass}/propertypropertyname=uservalue=${username}/propertypropertyname=passwordvalue=${password}/property/beanbeanid=dataSourceAclass=com.mchange.v2.c3p0.ComboPooledDataSource!--数据库连接信息--propertyname=jdbcUrlvalue=jdbc:mysql:///dynamictest/propertypropertyname=driverClassvalue=${driverClass}/propertypropertyname=uservalue=${username}/propertypropertyname=passwordvalue=${password}/property/beanbeanid=dynamicdatasourceclass=qilin.utils.DynamicDataSourcepropertyname=targetDataSourcesmapkey-type=java.lang.Stringentrykey=defaultDataSourcevalue-ref=defaultDataSource/entrykey=dataSourceAvalue-ref=dataSourceA//map/propertypropertyname=defaultTargetDataSourceref=defaultDataSource//bean!--配置SessionFactory--beanid=sessionFactoryclass=org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBeanpropertyname=dataSourceref=dynamicdatasource/propertyname=hibernatePropertiespropspropkey=hibernate.dialectorg.hibernate.dialect.MySQLDialect/proppropkey=hibernate.hbm2ddl.autonone/proppropkey=hibernate.show_sqltrue/proppropkey=hibernate.format_sqlfalse/proppropkey=hibernate.temp.use_jdbc_metadata_defaultsfalse/prop/props/property!--注解方式配置--propertyname=annotatedClasses535455565758596061626364656667listvalueqilin.entity.Student/value/list/property/bean!--配置声明式事务管理,采用基于注解的方式--beanid=transactionManagerclass=org.springframework.orm.hibernate3.HibernateTransactionManagerpropertyname=sessionFactoryref=sessionFactory/property/beantx:annotation-driventransaction-manager=transactionManager/beanid=dynamicLoadBeanclass=qilin.utils.DynamicLoadBean/bean/beans2.AbstractRoutingDataSource.class修改的部分[java]viewplaincopy1.?1234567/**@authorqilin**/publicvoidaddDataSource(Objectkey,ObjectdataSource){this.targetDataSources.put(key,dataSource);setTargetDataSources(this.targetDataSources);}3.DynamicDataSource.class这个类中有一个地方需要注意,当我们添加数据,切换了数据源,要通知当前spring容器,需要调用父类的super.afterPropertiesSet();方法[java]viewplaincopy1.?123456packageqilin.utils;importjava.util.Map;importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;importorg.springframework.jdbc.datasource.lookup.DataSourceLookup;7891011121314151617181920212223242526272829303132333435publicclassDynamicDataSourceextendsAbstractRoutingDataSource{/**该方法必须要重写方法是为了根据数据库标示符取得当前的数据库*/@OverridepublicObjectdetermineCurrentLookupKey(){returnDataSourceContextHolder.getDataSourceName();}@OverridepublicvoidsetDataSourceLookup(DataSourceLookupdataSourceLookup){super.setDataSourceLookup(dataSourceLookup);}@OverridepublicvoidsetDefaultTargetDataSource(ObjectdefaultTargetDataSource){super.setDefaultTargetDataSource(defaultTargetDataSource);}@OverridepublicvoidsetTargetDataSources(MaptargetDataSources){super.setTargetDataSources(targetDataSources);//重点super.afterPropertiesSet();}}4.动态加载数据源配置文件DynamicLoadBean.class[java]viewplaincopy1.?123456789packageqilin.utils;importjava.io.IOException;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.config.BeanDefinition;importorg.springframework.beans.factory.support.
本文标题:Spring动态创建,加载,使用多数据源
链接地址:https://www.777doc.com/doc-2859838 .html