日期:2014-05-16 浏览次数:20539 次
??????? 最近做做了一个项目,项目有这种需求,要求在同一套程序中,根据用户动态切换数据库。
??????? 在网上找了一下,发现很少这样的资料,即使有也不符合我的想法,所以没采纳。于是我试了试自己的想法,发现可行,现在与大家分享一下,也许这中想法很笨拙,希望高人指点。
??????? 首先,我介绍一下项目的开发环境:gwt-ext、spring、hibernate。其实本次项目几乎已经完结,但只有一个数据库。因为需求的变更,要他其他几个表结构相同的数据库也运行在此系统中,于是需要用到数据库的动态切换。对于一个已经完结的系统来说,如果修改过多的话,那是一件非常麻烦的事,所有要尽量减少变动,即以最少的修改,实现数据库的动态切换。
??????? 如果项目中没有使用spring,要实现动态切换数据库将是一个很容易的事情,就是因为使用了spring,使得动态切换数据库有些难度。现在,我来谈谈我的想法:首先,为每个数据源配置独立的sessionFactory和事务管理器,要想在程序运行动态切换数据库,其实只要动态切换sessionFactory即可。那么怎样在用户发出资源请求的时候,决定使用哪个数据库呢,在这里,我们只要充分灵活应用spring的bean作用域就可以实现。好,现在我们来看看spring 的bean有哪些作用域:singleton,prototype,session,request等。spring默认的作用域是singleton,作用域为singleton的bean,将只被初始化一次,所以要动态切换数据库,bean的作用域一定不能使用singleton。但如果为了减少系统的开销,使用session作用域的话,你必须使用servlet2.4以上版本,在web.xml中不在使用contextListener而是使用requestContextListener。此外,你还要了解,bean的实例化顺序,哪些bean先实例化,哪些后实例化。打个比方:bean A 依赖 bean B ,那么当用户请求资源时,spring 先实例化 bean A所依赖的bean B,然后再实例化 bean A。在web?应用程序中,我们一般使用三层结构:即 展示层、业务逻辑层和数据持久层。?为了减少修改,我把数据库的切换实现放在了数据持久层。但业务逻辑层,请求它所依赖的dao时,可通过某个标志来实行数据库的选择。在本系统中,我是通过用户账号来动态选择数据库的,当然这个账号必须符合某种规则。否则,程序无法判断此用户账号是属于哪个数据库的。
???????? 具体实行代码我就不写了,总而言之,只要灵活使用bean 的作用域,动态切换数据库其实也是很容易实现的
?
?