资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
Spring 动态创建,加载,使用多数据源发表于 2 年前(2014-02-26 18: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, 编 写 一 个 支 持 添 加 数据 源 对 象 的 方 法 public void addDataSource(Object key,Object dataSource)第 四 , 写 例 子 来 测 试实 现 过 程 如 下 :1.bean.xml 配 置 文 件html view plain copy 1. ?12345678org.hibernate.dialect.MySQLDialect none true false false 535455565758596061626364656667qilin.entity.Student 2.AbstractRoutingDataSource.class 修 改 的 部 分java view plain copy 1. ?1234567/*author qilin*/ public void addDataSource(Object key,Object dataSource) this.targetDataSources.put(key, dataSource); setTargetDataSources(this.targetDataSources); 3.DynamicDataSource.class 这 个 类 中 有 一 个 地 方 需 要 注 意 , 当 我 们 添 加 数 据 , 切 换了 数 据 源 , 要 通 知 当 前 spring 容 器 , 需 要 调 用 父 类 的 super.afterPropertiesSet();方法java view plain copy 1. ?12345package qilin.utils; import java.util.Map; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 67891011121314151617181920212223242526272829303132333435import org.springframework.jdbc.datasource.lookup.DataSourceLookup; public class DynamicDataSource extends AbstractRoutingDataSource /* * 该方法必须要重写 方法是为了根据数据库标示符取得当前的数据库 */ Override public Object determineCurrentLookupKey() return DataSourceContextHolder.getDataSourceName(); Override public void setDataSourceLookup(DataSourceLookup dataSourceLookup) super.setDataSourceLookup(dataSourceLookup); Override public void setDefaultTargetDataSource(Object defaultTargetDataSource) super.setDefaultTargetDataSource(defaultTargetDataSource); Override public void setTargetDataSources(Map targetDataSources) super.setTargetDataSources(targetDataSources); /重点 super.afterPropertiesSet(); 4.动 态 加 载 数 据 源 配 置 文 件 DynamicLoadBean.classjava view plain copy 1. ?12345678package qilin.utils; import java.io.IOException; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.ChildBeanDefinition; 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.ResourceEntityResolver; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ConfigurableApplicationContext; /* * 动?加载数据源 * author qilin * */ public class DynamicLoadBean implements ApplicationContextAware private ConfigurableApplicationContext applicationContext = null; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException this.applicationContext = (ConfigurableApplicationContext) applicationContext; public ConfigurableApplicationContext getApplicationContext() return applicationContext; /* * 1.配置文件的位置固? * 2.配置文件中 bean的名字已? * param configLocationString */ public void loadBean(String fileName) XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(BeanDefinitionRegistry)getApplicationContext().getBeanFactory(); beanDefinitionReader.setResourceLoader(getApplicationContext(); beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(getApplicationContext(); try beanDefinitionReader.loadBeanDefinitions(getApplicationContext().getResources(fileName); catch (BeansException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); 53545556575859public void registBean(String beanName, String parentName) DefaultListableBeanFactory fcy = (DefaultListableBeanFactory)applic
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号