欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring 3.0 +ibatIS2.0 两个数据源的实现 博客分类: spring spring3ibatIS2两个数据源 

程序员文章站 2024-03-01 15:42:58
...

项目变更需求

需要在生产库获得某一表的序列值,以此为主键插入到查询库。

 

修改spring配置,使其链接两个数据源。

以下为两个数据源配置。

 

代码:

spring xml配置,新增加了一个数据源,因为新的数据源只是查询使用,没有做事务处理。

 

<!--spring3 读取配置文件信息-->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreResourceNotFound" value="true"/>
        <property name="locations">
            <list>
                <value>classpath*:/configs/config/db.properties</value>
                <value>classpath*:/configs/config/project.properties</value>                 
            </list>
        </property>
    </bean>


    <!-- 数据源配置1 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <!-- Connection Info -->
        <property name="driverClass">
            <value>${jdbc.driver}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc.url}</value>
        </property>
        <property name="user">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
        <property name="minPoolSize">
            <value>0</value>
        </property>
        <property name="maxPoolSize">
            <value>100</value>
        </property>
        <property name="acquireIncrement">
            <value>5</value>
        </property>
        <property name="maxIdleTime">
            <value>10</value>
        </property>
        <property name="maxStatements">
            <value>0</value>
        </property>
		<property name="numHelperThreads">
			<value>3</value>
		</property>
		<!-- 当连接池连接耗尽时,客户端getConnection(),所等待的时间-->
		<property name="idleConnectionTestPeriod" value="120" />
		<!-- 当连接失效时,获得连接的次数,0为无限次(重连)-->
		<property name="acquireRetryAttempts" value="30" />
    </bean>


    <!-- 事务定义 begin-->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--service 里的方法(需要事务的)必须在 service类中以insert,update,delete开头 -->
    <tx:advice id="txAdvice">
        <tx:attributes>
            <tx:method name="insert*"/>
            <tx:method name="update*"/>
            <tx:method name="delete*"/>
			<tx:method name="batch*"/>
            <!--<tx:method name="batch*"/>-->
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <aop:config proxy-target-class="false">
        <aop:advisor
                pointcut="execution(* com.*.*.service.*.*Service.*(..))"
                advice-ref="txAdvice"/>
        <aop:advisor
                pointcut="execution(* com.*.*.*.*.service.*Service.*(..))"
                advice-ref="txAdvice"/>
    </aop:config>
    <!-- 事务定义 end-->


    <bean id="sqlMapClient"
          class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation"
                  value="classpath:configs/ibatis/SqlMapConfig.xml"/>
        <property name="dataSource" ref="dataSource"/>
    </bean> 
    
    <!-- *************************第二个数据源配置************************************************ --> 
    <!-- 数据源配置2 -->
    <bean id="dataSourceDB2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <!-- Connection Info -->
        <property name="driverClass">
            <value>${jdbc.driver}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc.url2}</value>
        </property>
        <property name="user">
            <value>${jdbc.username2}</value>
        </property>
        <property name="password">
            <value>${jdbc.password2}</value>
        </property>
        <property name="minPoolSize">
            <value>0</value>
        </property>
        <property name="maxPoolSize">
            <value>100</value>
        </property>
        <property name="acquireIncrement">
            <value>5</value>
        </property>
        <property name="maxIdleTime">
            <value>10</value>
        </property>
        <property name="maxStatements">
            <value>0</value>
        </property>
		<property name="numHelperThreads">
			<value>3</value>
		</property>
		<!-- 当连接池连接耗尽时,客户端getConnection(),所等待的时间-->
		<property name="idleConnectionTestPeriod" value="120" />
		<!-- 当连接失效时,获得连接的次数,0为无限次(重连)-->
		<property name="acquireRetryAttempts" value="30" />
    </bean>

    <bean id="sqlMapClientDB2"
          class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation"
                  value="classpath:configs/ibatis/SqlMapConfigDB2.xml"/>
        <property name="dataSource" ref="dataSourceDB2"/>
    </bean> 
    
    <!-- 总体dao层 sqlMapClient提供数据库1链接,sqlMapClientDB2提供数据库2链接 -->
    <bean id="ibatisEntityDao"
          class="com.fenghuoyun.dataintegration.common.ibatis.IBatisEntityDaoImpl">
          <property name="sqlMapClient" ref="sqlMapClient"/>
          <property name="sqlMapClientDB2" ref="sqlMapClientDB2"/>
    </bean> 

 

ibatIS 基础 dao :

@SuppressWarnings("unchecked")
public class IBatisEntityDaoImpl extends SqlMapClientDaoSupport implements
        IEntityDao {
	
	protected SqlMapClient sqlMapClientDB2;//第二个数据库
	
    public SqlMapClient getSqlMapClientDB2() {
		return sqlMapClientDB2;
	}

	public void setSqlMapClientDB2(SqlMapClient sqlMapClientDB2) {
		this.sqlMapClientDB2 = sqlMapClientDB2;
	}
	
	
	public <T> T viewEntityDB2(String xmlId, Object id) throws SQLException {
        T t = (T)sqlMapClientDB2.queryForObject(xmlId, id);
        return t;
       }
    public <T> T viewEntity(String xmlId, Object id) {
        T t = (T) getSqlMapClientTemplate().queryForObject(xmlId, id);
        return t;
    }


}

 使用的时候调用不同的方法去两个数据库查询数据。

 

dao为测试,且第二个数据源没有事务处理。

 

经过测试,成功。