急:SaaS模式,spring根据登录用户自动修改datesource并重新加载 本帖最后由 pk490525 于 2012-10-29 11:44:59 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 正好我近期刚做了这个实现,需求和LZ一模一样,只不过不过我的数据库是mysql5.5而已。切换数据库是使用的ThreadLocal来实现的。LZ的实现思路是完全可以的,目前我已经写完代码且测试过。实现思路:取得系统当前的ApplicationContext对象,获得dataSouerce的bean实例DynamicDataSource,向DynamicDataSource的targetDataSources的集合map中添加新的DriverManagerDataSource,再调用afterPropertiesSet()方法即可。 实现方法的测试代码: * 给当前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(); } 终于解决了,我说呢,网上那么多方案我都试了可是就是不出来,就因为我的连接池的名字起得是一样的。蛋疼的失误。不过只是实现的初步,不知道各位对优化上有什么好的建议?小弟邮箱:[email protected] oh 发现问题了,getTargetDataSources();,求该方法 getTargetDataSources()是Spring JAR包中的AbstractRoutingDataSource抽象类中的方法public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean { public AbstractRoutingDataSource() { dataSourceLookup = new JndiDataSourceLookup(); } public void setTargetDataSources(Map targetDataSources) { this.targetDataSources = targetDataSources; } public Map getTargetDataSources() { return this.targetDataSources; } public void setDefaultTargetDataSource(Object defaultTargetDataSource) { this.defaultTargetDataSource = defaultTargetDataSource; } ...... 楼上大侠 这个你应该是修改了源码吧,我这个spring包里是没有这个方法的 freemarker 空值的问题 ibatis加载不了xml文件?急切!!! 求职 求助 eclipse oracle 如何导出表空间 ireport 导出html 没有为类型 HibernateService 定义方法 exceQuery(String) 为什么会没有呢? hibernate现在出到3.05了,请问3.0和2.0之间有什么区别,各位用hibernate做项目一般用哪个版本的呢 哪里有Tomcat的安装版下载? action中使用@Service问题 下面代码是啥?
LZ的实现思路是完全可以的,目前我已经写完代码且测试过。
实现思路:
取得系统当前的ApplicationContext对象,获得dataSouerce的bean实例DynamicDataSource,
向DynamicDataSource的targetDataSources的集合map中添加新的DriverManagerDataSource,再调用
afterPropertiesSet()方法即可。
* 给当前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();
}
蛋疼的失误。不过只是实现的初步,不知道各位对优化上有什么好的建议?
小弟邮箱:[email protected]
,求该方法
public abstract class AbstractRoutingDataSource extends AbstractDataSource
implements InitializingBean { public AbstractRoutingDataSource() {
dataSourceLookup = new JndiDataSourceLookup();
} public void setTargetDataSources(Map targetDataSources) {
this.targetDataSources = targetDataSources;
} public Map getTargetDataSources() {
return this.targetDataSources;
} public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
this.defaultTargetDataSource = defaultTargetDataSource;
}
......