zyskm用梦想丈量人生,用奔跑丈量激情

基于spring的动态数据源

基于spring的动态数据源
项目过程中遇到这样一个需求,系统启动后动态设置数据源,不同用户登录系统后访问的数据库不同。
好在所有书库结构一致。
用spring 的AbstractRoutingDataSource解决了这个问题。
原理如图:

项目采用的是hibernate,直接在spring.xml设置sessionFactory的dataSource属性为动态数据源即可。
因为项目所有数据库结构都一致,为了避免每次设置数据源的时候要改一堆参数,修改了spring AbstractRoutingDataSource类增加了一个getTargetDataSources方法,获取当前数据源详细信息,在其基础上修改数据库名称、用户名、密码即可,不用每次设置一堆参数。
Map<String,ComboPooledDataSource> targetDataSources=dynamicDataSource.getTargetDataSources();
                
if(targetDataSources==null){
                    targetDataSources
=new HashMap<String, ComboPooledDataSource>();
                    targetDataSources.put(
"baseDataSource", baseDataSource);
                }

                targetDataSources.put(dataSourceName, subSystemDataSource);
                dynamicDataSource.setTargetDataSources(targetDataSources);
                dynamicDataSource.afterPropertiesSet();
另外,设置AbstractRoutingDataSource参数后要调用afterPropertiesSet()方法,spring容器才会进行加载操作。

在动态设置数据源方面,可以通过两种方式实现:
1.在action(项目使用struts)中进行设置,可以确保在每个servlet线程中数据源是一致的。
2.以aop方式,对service方法进行拦截,根据需求设置不同数据源。

posted on 2011-10-24 17:11 zyskm 阅读(3575) 评论(2)  编辑  收藏

评论

# re: 基于spring的动态数据源 2011-10-25 08:22 tbw

很好的想法   回复  更多评论   

# re: 基于spring的动态数据源 2012-09-07 15:31 wys

方案非常不错,不知道能不能把相关代码共享一下,目前也遇到类似的需求希望能够帮助解决一下,谢谢了,Q邮箱:471372495@qq.com  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: