- 浏览: 1573580 次
-
文章分类
- 全部博客 (557)
- Spring 3 系列 (26)
- Spring 3 (4)
- oracle (7)
- java (6)
- css3 (1)
- andorid (11)
- IE中页面不居中 (1)
- crm (1)
- ibatis (1)
- jdbc (1)
- javacore (1)
- IT 生活 (3)
- 创业的简单感受 (1)
- web前端 (1)
- Java静态代理 (1)
- pdf (6)
- 模拟 (1)
- 数论 (1)
- ACM_POJ (2)
- C/C++求职面试必备考点 (1)
- 学习Android遇到的错误 (1)
- 嵌入式学习 (1)
- magento付费模板! (1)
- PHP (1)
- Oracle 开发 (1)
- MSSQL (1)
- javascript (6)
- 随感随想 (1)
- RobotFramework (1)
- Ajax (2)
- 数据库复习 (1)
- Java Web (1)
- Way (1)
- eclipse (1)
- 分布式 (1)
- 【ASP.NET开发】 (1)
- 搜索 (1)
- UML建模 (1)
- ANDROID (2)
- 编程技巧 (1)
- 程序员 (2)
- C语言相关 (1)
- Struts2 (1)
- 精品下载资源推荐 (1)
- CUDA (1)
- MFC (1)
- 游戏编程 (1)
- oracle数据库 (1)
- 暴力求解--哈希表 (1)
- 个人文章 (1)
- 最小生成树 (1)
- linux 基础 (1)
- Flex (1)
- Linux (1)
- UML (1)
- 云计算 (1)
- android ListView (1)
- java数据库连接池 (1)
- cxf (1)
- javas (0)
- jquery (2)
最新评论
-
lj杰:
您好,最近项目涉及这这方面的技术,能分享下源码不,小弟非常感谢 ...
Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能 -
成大大的:
Android自动化测试从入门到精通网盘地址:https:// ...
4种手机自动化测试框架介绍 -
u012944589:
[size=xx-large][size=xx-small][ ...
Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能 -
stone520520:
同求源码,这几天正想研究一下视频的相关功能mail: 1862 ...
Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能 -
zhen8023wan:
源代码可以发给我一份吗?谢谢!qq邮箱:1796482787@ ...
Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
在前面我写了《如何在 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
的代码如下:
MultiSessionFactory的完整代码见我提供的附件。
setSessionFactory()
实际上是设定的默认
sessionFactory
,它在
spring
装载的时候调用,其对应的数据源应当是主数据源,即项目初始化中需要读取初始化数据的数据源。在任何多数据源项目中,都应当有一个存放初始化数据、系统维护数据、用户权限数据的数据源,这就是主数据源。因此
MultiSessionFactory
的配置应当这样写:
SpServer的写法与《如何在
spring
框架中解决多数据源的问题》
中的一样,我就不再累赘了。
另外,在
spring
配置中配置多个数据源,每个数据源对应一个
sessionFactory
,这个对应的
sessionFactory
中的值对象应当是该数据源的值对象。客户程序在执行数据访问前,通过调用
SpServer
的
putSp()
方法,告诉
MultiSessionFactory
需要切换到哪个
sessionFactory
,然后执行数据访问。这样,不同数据源的值对象通过放在不同的
sessionFactory
中,避免了张冠李戴的情况。具体的示例见附件的
MultiSessionFactoryTest
。
也许有些朋友对以上方案还不满意,因为在执行数据访问前毕竟还要多做一步指定
sessionFactory
的工作。实际上,对于各个数据源的数据结构不同的项目,一个值对象应当使用哪个数据源有一个非常确定的对应关系。如果通过配置文件将值对象与它的
sessionFactory
对应起来,那么我们在执行数据访问的时候传递的是哪个值对象,
MultiSessionFactory
马上就可以去找到对应的
sessionFactory
。这个方案你可以通过
AOP
来制作一个拦截器拦截所有诸如
save()
、
delete()
、
get()
、
load()
等方法来实现,也可以扩展
HibernateDaoSupport
来实现。这样的方案使客户程序甚至都不用知道他是在操作的一个多数据源系统。当然,这个方案感兴趣的朋友可以自己去实现。
另外,在这个方案中的核心是运用
Decorator
设计模式来解决切换
sessionFactory
的目的,即
MultiSessionFactory
的实现。至于通过什么方式来通知
MultiSessionFactory
应当切换到哪个
SessionFactory
,可以根据不同项目的情况自由选择。我在这里给大家提供了通过
SpOberver
和建立值对象与
sessionFactory
关系的配置文件这两个方案,你也可以有自己的方案解决。
前面我已经给出了第一种和第二种情况的解决方案:各个数据源的数据结构不同的情况用
MultiSessionFactory
解决;各个数据源的数据结构相同的情况用
MultiDataSource
解决。那么第三种情况,各个数据源的数据结构部分相同又有部分不同,又应当如何解决呢?当然是将
MultiSessionFactory
和
MultiDataSource
结合起来解决。对于数据结构不同的部分,其分别创建各自的
sessionFactory
然后通过
MultiSessionFactory
来切换,而对于数据结构相同的部分,建立共同的
sessionFactory
和多个不同的
dataSource
然后通过
MultiDataSource
来切换就可以了。
方案的实现
另外的方案
第三种情况的解决方案
发表评论
-
Spring Batch学习(一)介绍
2015-01-08 17:17 8470为什么我们需要批处理? 我们不会总是想要立即得到需要的信 ... -
spring包详解
2012-04-22 14:58 1730下载的spring包中文件及各种包众多,在项目中往往只有 ... -
我的spring学习笔记2-IoC(反向控制 依赖注入)
2012-04-10 07:50 2789IoC(反向控制 依赖注入)这是Spring提出来了,这也是S ... -
我的spring学习笔记1-spring 简介
2012-04-10 07:49 21911.1. 概览 ... -
我的spring学习笔记15-容器扩展点之PropertyOverrideConfigurer
2012-04-22 14:55 1910PropertyOverrideConfigurer类似于Pr ... -
我的spring学习笔记14-容器扩展点之PropertyPlaceholderConfigurer
2012-04-22 14:55 1879PropertyPlaceholderConfigurer是个 ... -
我的spring学习笔记10-轻量级_Spring框架
2012-04-14 21:59 2013一、问题提问: ... -
我的spring学习笔记9-Spring使用工厂方法实例化Bean的注意点
2012-04-14 21:59 1594方法一: <bean id="m ... -
我的spring学习笔记8-Spring中Bean的实例化
2012-04-14 21:59 1507在Spring中要实例化一个Bean有几种方法: 1、最常用 ... -
我的spring学习笔记7-Spring的Bean配置文件给Bean定义别名
2012-04-14 21:59 3052本文介绍如何给Spring的Bean配置文件的Bean定义别名 ... -
我的spring学习笔记6-ApplicationContext实例化的参数兼容思想
2012-04-14 21:59 1523ApplicationContext能读取多个Bean定义文件 ... -
我的spring学习笔记5-如何使用ApplicationContext替换BeanFactory
2012-04-12 22:03 1924如何使用ApplicationContext替换BeanFac ... -
我的spring学习笔记4-ApplicationContext详解
2012-04-12 22:03 4376ontext的核心作用是ApplicationConte ... -
我的spring学习笔记3-BeanFactory 详解
2012-04-12 22:03 19951、BeanFactory是 ... -
我的spring学习笔记2-IoC(反向控制 依赖注入)
2012-04-12 22:03 1242IoC(反向控制 依赖注入)这是Spring提出来了,这也是S ... -
我的spring学习笔记-spring 简介
2012-04-12 22:03 16051.1. 概览 ... -
Spring中事件处理de小技巧
2012-04-08 12:01 1628Spring 中提供一些Aware相关de接口,Be ... -
关于使用Spring导致c3p0数据库死锁问题
2012-04-08 11:59 6532这个问题我实在是为整个 springsource 的员工蒙羞 ... -
SPRING多数据源切换的问题和解决方法
2012-04-08 11:56 4527在应用中,需要热切换数据源。但发现如下问题: J ... -
如何在spring框架中解决多数据源的问题
2012-04-08 11:50 2987今天碰见Spring + 多个数 ...
相关推荐
在纷析云开源财务系统中,Vue3可能被用于构建用户界面,提供直观的交互体验和灵活的数据绑定,确保用户能够轻松操作和管理财务数据。 开源云财务软件的概念意味着源代码对公众开放,用户可以自由查看、使用、修改和...
此zip压缩包中包含了本毕业设计的全部内容,具体包括源代码、论文以及PPT模板。 配置好java环境就能跑,如需其他功能可自行扩展, 运行条件: 确保已安装JDK 1.8及以上版本,并配置好Java环境变量。 使用Eclipse或...
此zip压缩包中包含了本毕业设计的全部内容,具体包括源代码、论文以及PPT模板。 配置好java环境就能跑,如需其他功能可自行扩展, 运行条件: 确保已安装JDK 1.8及以上版本,并配置好Java环境变量。 使用Eclipse或...
在这个"剖 析 Webwork 源 码_V0.9"的资源包中,我们可以深入理解Webwork的核心机制和设计思想。以下是关于Webwork的一些关键知识点: 1. **MVC架构**: - MVC模式是软件工程中一种用于分离业务逻辑、数据模型与...
13. **Spring框架**:Spring是Java企业级应用的主流框架,它简化了依赖注入、AOP(面向切面编程)、事务管理等多个方面的工作。 14. **Lambda表达式**:Java 8引入的Lambda表达式简化了函数式编程,使得代码更简洁...
- **概念**:多线程是指在单个程序中同时运行多个线程的能力。 - **线程创建**:通过继承`Thread`类或实现`Runnable`接口。 - **线程同步**:使用`synchronized`关键字、`ReentrantLock`等工具进行同步。 - **并发...
- **解决问题的能力**:面对复杂问题时能够快速找到解决方案。 - **性格因素**:开放性、责任心强的个性更有利于团队合作和个人发展。 10. **处理不愿做的任务** - 首先尝试理解和接受任务的意义。 - 如果仍然...