本帖最后由 pk490525 于 2012-10-29 11:44:59 编辑

解决方案 »

  1.   

    正好我近期刚做了这个实现,需求和LZ一模一样,只不过不过我的数据库是mysql5.5而已。切换数据库是使用的ThreadLocal来实现的。
    LZ的实现思路是完全可以的,目前我已经写完代码且测试过。
    实现思路:
    取得系统当前的ApplicationContext对象,获得dataSouerce的bean实例DynamicDataSource,
    向DynamicDataSource的targetDataSources的集合map中添加新的DriverManagerDataSource,再调用
    afterPropertiesSet()方法即可。
      

  2.   

    实现方法的测试代码:
     * 给当前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();
    }
      

  3.   

    终于解决了,我说呢,网上那么多方案我都试了可是就是不出来,就因为我的连接池的名字起得是一样的。
    蛋疼的失误。不过只是实现的初步,不知道各位对优化上有什么好的建议?
    小弟邮箱:[email protected]
      

  4.   

    oh 发现问题了,getTargetDataSources();
    ,求该方法
      

  5.   

    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;
    }
            ......
      

  6.   

    楼上大侠 这个你应该是修改了源码吧,我这个spring包里是没有这个方法的