- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
再析在spring框架中解决多数据源的问题
在前面我写了《如何在spring框架中解决多数据源的问题》,通过设计模式中的Decorator模式在spring框架中解决多数据源的问题,得到了许多网友的关注。在与网友探讨该问题的过程中,我发现我的方案并不完善,它只解决了一部分问题。
总结多数据源的问题,其实它需要分为以下三种情况:各个数据源的数据结构不同、各个数据源的数据结构相同、各个数据源的数据结构部分相同又有部分不同。对于第二种情况,各个数据源的数据结构相同,我们使用一个sessionFactory,而在sessionFactory中通过MultiDataSource来动态切换数据源,应当是一个不错的方案,既解决了多个sessionFactory对相同的值对象重复装载对内存的浪费,又使数据源的切换对客户程序透明,简化了代码的实现和对客户程序的影响。但是,对于第一种情况,各个数据源的数据结构不同,运用这样的方案存在潜在风险。
对于各个数据源的数据结构不同的情况,使用一个sessionFactory而在这个sessionFactory中动态切换数据源,可能造成数据访问的张冠李戴。譬如,数据源A有表T而数据源B没有,可能造成客户程序在访问表T的时候却尝试去连接数据源B,因为客户程序访问哪个数据源是在程序运行期间由客户程序决定的,因此这样的错误是很难发现的。也许客户程序的一个不经意的错误就可能造成错误。解决这个问题的方法有两个:一是严格要求客户程序不要写错,这当然是可以做到的,但作为框架设计者,另一个解决方法是在框架中就避免出现这样的情况。因此我祭出了MultiSessionFactory的方案来解决各个数据源的数据结构不同的多数据源问题。
问题的分析
与MultiDataSource的方案一样,MultiSessionFactory同样是在spring框架下调用ApplicationContext的getBean()方法而不会另外创建beanFacoty,也同样使用Decorator模式来处理切换的问题。MultiSessionFactory的对象关系如图:
在该方案中,SessionFactory就是Hibernate的org.hibernate.SessionFactory接口,Decorator就是MultiSessionFactory,SessionFactory1和SessionFactory2往往是spring的org.springframework.orm.hibernate3.LocalSessionFactoryBean。细心的朋友可能会注意,实际上LocalSessionFactoryBean并不是SessionFactory的实现,这个方案是否有问题呢?这个问题其实也一直困扰了我好久,最后我发现,我们通过ApplicationContext的getBean()得到一个LocalSessionFactoryBean的时候其实并不是真正地得到了它,而是得到了一个SessionFactory,因为spring为LocalSessionFactoryBean重写了getObject(),使其返回的是SessionFactory。一个简单的明证就是,HibernateDaoSupport的sessionFactory属性的类型是SessionFactory,而我们在spring配置的时候注入的却是LocalSessionFactoryBean。
方案的实现
在整个这个方案中,我们需要实现的只有MultiSessionFactory类和我们可爱的Spserver,总共就两个类,然后呢就是一些spring的配置,就完成了。
MultiSessionFactory实现了SessionFactory,同时为了得到AplicationContext而实现了ApplicationContextAware。MultiSessionFactory的代码如下:
java 代码
public?class?MultiSessionFactory?implements?SessionFactory,?ApplicationContextAware?{ ??
????private?static?final?long?serialVersionUID?=?2064557324203496378L; ??
????private?static?final?Log?log?=?LogFactory.getLog(MultiSessionFactory.class); ??
????private?ApplicationContext?applicationContext?=?null; ??
????private?SessionFactory?sessionFactory?=?n
您可能关注的文档
- Huffman源程序(C++).doc
- 自耦变压器小结.doc
- 投资学复习资料答案.doc
- 财务管理ppt作业.doc
- 2010至2012年中等学校招生统一考试生物部分(含答案).doc
- 2013新目标英语初一下课文.doc
- 实施创新教学策略杨.doc
- 中西方文化的差异及商务谈判异同.doc
- ARM7的RTU微控制器的设计.doc
- (钻孔桩水下混凝土灌注记录)施记表10.doc
- 《GB/T 22838.3-2025卷烟和滤棒物理性能的测定 第3部分:圆周 非接触光学法》.pdf
- 中国国家标准 GB/T 7410.1-2025搪瓷制品和瓷釉 术语 第1部分:术语和定义.pdf
- 《GB/T 7410.1-2025搪瓷制品和瓷釉 术语 第1部分:术语和定义》.pdf
- GB/T 7410.1-2025搪瓷制品和瓷釉 术语 第1部分:术语和定义.pdf
- 《GB/T 32151.54-2025温室气体排放核算与报告要求 第54部分:工业硫酸企业》.pdf
- GB/T 32151.54-2025温室气体排放核算与报告要求 第54部分:工业硫酸企业.pdf
- 中国国家标准 GB/T 32151.54-2025温室气体排放核算与报告要求 第54部分:工业硫酸企业.pdf
- 中国国家标准 GB/T 29152-2025垃圾焚烧尾气处理设备.pdf
- 《T/CHTS 10170-2024半开级配超薄磨耗层技术指南》.pdf
- T/CHTS 10170-2024半开级配超薄磨耗层技术指南.pdf
原创力文档


文档评论(0)