日期:2014-05-18  浏览次数:20710 次

急:SaaS模式,spring根据登录用户自动修改datesource并重新加载
本帖最后由 pk490525 于 2012-10-29 11:44:59 编辑
近日碰得到这样的一个需求:系统根据登录的用户判断其所属公司,然后更换当前datasource的username,password达到切换数据库的目的,数据库oracle,不同的公司有不同的schema,也就是oracle的用户。

项目是ssh组合框架,之前在网上也搜了不少,但是大多数的都是预先配置好多个datasource达到切换的目的,但是我这个datesource是不确定,不晓得会有几个,所以无法采用该方案,因此小弟想,看看能不能等用户登录成功后,修改当前的datasource的用户名,密码然后重新加载datatsource以达到切换数据库目的。

苦于无技术解决方案,求各位大神们指点下,在线等答复,各路英雄也捧捧场,小弟先谢啦。

------解决方案--------------------
实现方法的测试代码:
 * 给当前ApplicationContext动态添加新的数据源
 * 实现思路:取得系统当前的ApplicationContext对象,获得dataSouerce的bean实例DynamicDataSource,
 * 向DynamicDataSource的map中添加新的DriverManagerDataSource即可
 * 
 * @param dataSoucerName
 *            数据库名且不能为空
 */
public void addDataSourceToContext(String dataSoucerName) {
DriverManagerDataSource newDS = new DriverManagerDataSource();
newDS.setDriverClassName("com.mysql.jdbc.Driver");
newDS.setPassword("1234");
newDS.setUrl("jdbc:mysql://localhost:3306/"+dataSoucerName+"?useUnicode=true&characterEncoding=UTF-8");
newDS.setUsername("root");
// 取得当前的WebApplicationContext对象
//WebApplicationContext context = this.getSessionApplicationContext();
WebApplicationContext context = (WebApplicationContext) SystemApplicationContext.getContext();
// 取得当前beanId为dataSource的bean实例DynamicDataSource
DynamicDataSource dds = (DynamicDataSource) context.getBean("dataSource");
// 从DynamicDataSource实例中取得map,其中存储的是DriverManagerDataSource
Map map = dds.getTargetDataSources();
// 加入Map
map.put(dataSoucerName, newDS);
// 设置完参数后调用
dds.afterPropertiesSet();
}
------解决方案--------------------
二楼亮了。三楼威武