小弟刚开始学习spring方面的内容,遇到一个问题,我在一个项目中涉及到很多的数据库,想在spring中配置多个数据源如何操作呢。我的配置文件是这样的 在我的application.properties 有jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8
jdbc.url1=jdbc:mysql://localhost/test1?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
每当一个多一个数据库 我就在这个配置文件添加一个jdbc.url 命名为jdbc.url加一个数字名
在applicationContent.xml中<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" /> <!-- Connection Pooling Info -->
<property name="initialSize" value="5" />
<property name="maxActive" value="100" />
<property name="maxIdle" value="30" />
<property name="maxWait" value="1000" />
<property name="poolPreparedStatements" value="false" />
<property name="defaultAutoCommit" value="false" />

</bean>这样设置。
这里<property name="url" value="${jdbc.url}" /> property name="url" 如何根据程序传递一个datasource标识去动态的获取url的value值呢。如何设置默认的动态url连接呢。请赐教!

解决方案 »

  1.   

    <bean id="dataSource" 起名不同,程序里面按该名取连接就可以
      

  2.   

    嗯,那样是可以用写多个dataSource不同的名字,但是我觉得这样写有些冗余,这样又会建立多个不同的sessionFactory,如果多个数据库的话很容易搞乱了, 能否只用一个datasource ,通过一些手段,比如代理什么的方式来实现呢。
      

  3.   


    这样并没有什么好处,可以写一个 .properties,动态配置数据库。但是,为什么要用多个数据库来做?而不是一个数据库,多张表,这不是添麻烦嘛
      

  4.   

    给你一个我们用的:
    context.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/jee    
                    http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
    <jee:jndi-lookup id="mysqlds" jndi-name="java:comp/env/jdbc/mysqlds" />
    <jee:jndi-lookup id="orads" jndi-name="java:comp/env/jdbc/orads" />
    <bean id="dataSource" class="util.DynamicDataSource">
    <property name="targetDataSources">
    <map key-type="java.lang.String">
    <entry key="0" value-ref="mysqlds" />
    <entry key="1" value-ref="orads" />
    </map>
    </property>
    <property name="defaultTargetDataSource" ref="orads" />
    </bean>
    </beans>
    package util;public class DbContextHolder {
    private static final ThreadLocal contextHolder = new ThreadLocal(); public static void setDbType(String dbType) {
    contextHolder.set(dbType);
    } public static String getDbType() {
    return (String) contextHolder.get();
    } public static void clearDbType() {
    contextHolder.remove();
    }
    }
    package util;import java.sql.SQLException;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource {  
    //static Logger log = Logger.getLogger("DynamicDataSource");  
    @Override  
    protected Object determineCurrentLookupKey() {  
    // TODO
    return DbContextHolder.getDbType();  
    } @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
    // TODO Auto-generated method stub
    return false;
    } @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
    // TODO Auto-generated method stub
    return null;
    }
    }
    测试程序:DbContextHolder.setDbType("1");  
                UserDomain od = this.testService.queryUserAccount("admin");
                System.out.println("username=="+od.getName());
                
                
                DbContextHolder.setDbType("0"); 
    d = this.testService.queryUserAccount("admin");
      

  5.   

    美女的这个方法貌似可以解决我这个问题,但是我有一点不明白的地方,连接数据库的DBname DBPassword DBurl在哪块配置啊。没用过JNDI的方式
      

  6.   

    晕啦,你在tomcat里面配置2个数据源就行啦嘛
      

  7.   

    呵呵,我刚才看了jndi的介绍。了解jndi的配置,但是我们的web容器 也可能不是tomcat ,也有可能是weblogic,也有可能是resin。不希望直接在web 容器上修改。还有更好的办法么
      

  8.   

    或者
    你的
    <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <!-- Connection Info -->
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />        <!-- Connection Pooling Info -->
            <property name="initialSize" value="5" />
            <property name="maxActive" value="100" />
            <property name="maxIdle" value="30" />
            <property name="maxWait" value="1000" />
            <property name="poolPreparedStatements" value="false" />
            <property name="defaultAutoCommit" value="false" />
        
        </bean>
    <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <!-- Connection Info -->
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />        <!-- Connection Pooling Info -->
            <property name="initialSize" value="5" />
            <property name="maxActive" value="100" />
            <property name="maxIdle" value="30" />
            <property name="maxWait" value="1000" />
            <property name="poolPreparedStatements" value="false" />
            <property name="defaultAutoCommit" value="false" />
        
        </bean><bean id="dataSource" class="util.DynamicDataSource"> 
    <property name="targetDataSources"> 
    <map key-type="java.lang.String"> 
    <entry key="0" value-ref="dataSource1" /> 
    <entry key="1" value-ref="dataSource2" /> 
    </map> 
    </property> 
    <property name="defaultTargetDataSource" ref="dataSource1" /> 
    </bean> 
    </beans> 
    不就行啦
      

  9.   

    美女啊!还是有问题啊!dh.setDbType("1"); 这个没起作用啊! 我按照你的方案配置好了
    然后在一个action里 有一个删除的方法我这样定义public String delete() throws Exception {
    try {
    DbContextHolder dh = new DbContextHolder();
    dh.setDbType("1");
    securityManager.deleteTestUser(id);

    } catch (ServiceException e) {

    }
    return null;
    }
    setDbType("1");使用第二个datasource。但是这个方法调用的还是第一个datasource连接的数据库啊
      

  10.   

    <bean id="dataSource"> 起名不同,程序里面按该名取连接就可以http://blog.csdn.net/alex197963/archive/2009/08/20/4466810.aspx
    看看这个个blog
      

  11.   


    看过这个博客写的内容,我觉得这个配置文件写的重复的内容太多。没定义datasource 就多写一些sessionFactoryGPS和transactionManagerGPS,我想定义一个datasource类似于接口的东西。去公共调用
      

  12.   

    问题解决了。查询的数据库表调弄错了。warison2008 的方法很不错!采纳了!
      

  13.   

    jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver请问我用这个躯动行吗,就是二个不同的数据库,其它都一样,同一服务器.
      

  14.   

    我也碰到了这样的问题,求解决
    DEBUG [main] - Converting String to [class [Ljava.lang.Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: 
    ### Error querying database.  Cause: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'friendou.fdidnews' doesn't exist
    ### The error may exist in friendou/ibatis3/mapping/FRIENDOU__FDIDNEWS_SqlMap.xml
    ### The error may involve friendou.ibatis3.dao.FdidnewsDAO.getinfofdidandshareid-Inline
    ### The error occurred while setting parameters
    ### SQL: select * from FRIENDOU.FDIDNEWS where FDID = ? and `INDEX`= ?
    ### Cause: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'friendou.fdidnews' doesn't exist