spring动态配置多个数据源,程序在运行时根据请求和系统状态决定操作哪个数据库,这样可以提高系统的水平伸缩性。
配置多个数据源的步骤如下:
1.配置多个数据源
<!-- MYSQL数据源 -->
<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<beans:property name="driverClass">
<beans:value>${dataSource.driverClassNameMS}</beans:value>
</beans:property>
<beans:property name="jdbcUrl">
<beans:value>${dataSource.urlMS}</beans:value>
</beans:property>
<beans:property name="user">
<beans:value>${dataSource.usernameMS}</beans:value>
</beans:property>
<beans:property name="password">
<beans:value>${dataSource.passwordMS}</beans:value>
</beans:property>
</beans:bean>
<!-- sqlserver 数据源 -->
<beans:bean id="dataSourceSqlserver" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<beans:property name="driverClass">
<beans:value>${dataSource.driverClassNameSS}</beans:value>
</beans:property>
<beans:property name="jdbcUrl">
<beans:value>${dataSource.driverClassNameSS}</beans:value>
</beans:property>
<beans:property name="user">
<beans:value>${dataSource.usernameSS}</beans:value>
</beans:property>
<beans:property name="password">
<beans:value>${dataSource.passwordSS}</beans:value>
</beans:property>
</beans:bean>
2.配置多个sessionFactory
<!-- mysql session工厂 -->
<beans:bean id="sessionFactoryMysql"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">
${dataSource.dialect}
</beans:prop>
<beans:prop key="hibernate.show_sql">
false
</beans:prop>
</beans:props>
</beans:property>
<beans:property name="packagesToScan">
<beans:list>
<!-- 扫描实体类,model -->
<beans:value>实体类包名</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<!-- SQLServer session工厂 -->
<beans:bean id="sessionFactorySqlServer"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<beans:property name="dataSource" ref="dataSourceSqlserver" />
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">
${dataSource.dialect}
</beans:prop>
<beans:prop key="hibernate.show_sql">
true
</beans:prop>
</beans:props>
</beans:property>
<beans:property name="packagesToScan">
<beans:list>
<!-- 扫描实体类,model -->
<beans:value>实体类包名</beans:value>
</beans:list>
</beans:property>
</beans:bean>
3.配置多个事务
<!-- mysql事务 -->
<beans:bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="sessionFactoryMysql" />
</beans:bean>
<!-- SQLServer事务 -->
<beans:bean id="transactionManagerSS" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="sessionFactorySqlServer" />
</beans:bean>
4.配置多个事务拦截器
<beans:bean id="transactionInterceptorMysql"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<beans:property name="transactionManager" ref="transactionManager" />
<beans:property name="transactionAttributes">
<beans:props>
<beans:prop key="get*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="find*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="query*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="load*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="export*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="save*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="insert*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="update*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="del*">PROPAGATION_REQUIRED</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="transactionInterceptorSqlServer"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<beans:property name="transactionManager" ref="transactionManagerSS" />
<beans:property name="transactionAttributes">
<beans:props>
<beans:prop key="get*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="find*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="query*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="load*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="export*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="save*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="insert*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="update*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="del*">PROPAGATION_REQUIRED</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
5.配置多个事务拦截器
<beans:bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<beans:property name="beanNames">
<beans:list>
<beans:value>事务加载的类</beans:value>
</beans:list>
</beans:property>
<beans:property name="interceptorNames">
<beans:list>
<beans:value>transactionInterceptorMysql</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<beans:property name="beanNames">
<beans:list>
<beans:value>事务加载的类</beans:value>
</beans:list>
</beans:property>
<beans:property name="interceptorNames">
<beans:list>
<beans:value>transactionInterceptorSqlServer</beans:value>
</beans:list>
</beans:property>
</beans:bean>
备注:
在applicationContext-basicData.xml配置dao类的时候注入的sessionfactory不同
配置多个数据源的步骤如下:
1.配置多个数据源
<!-- MYSQL数据源 -->
<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<beans:property name="driverClass">
<beans:value>${dataSource.driverClassNameMS}</beans:value>
</beans:property>
<beans:property name="jdbcUrl">
<beans:value>${dataSource.urlMS}</beans:value>
</beans:property>
<beans:property name="user">
<beans:value>${dataSource.usernameMS}</beans:value>
</beans:property>
<beans:property name="password">
<beans:value>${dataSource.passwordMS}</beans:value>
</beans:property>
</beans:bean>
<!-- sqlserver 数据源 -->
<beans:bean id="dataSourceSqlserver" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<beans:property name="driverClass">
<beans:value>${dataSource.driverClassNameSS}</beans:value>
</beans:property>
<beans:property name="jdbcUrl">
<beans:value>${dataSource.driverClassNameSS}</beans:value>
</beans:property>
<beans:property name="user">
<beans:value>${dataSource.usernameSS}</beans:value>
</beans:property>
<beans:property name="password">
<beans:value>${dataSource.passwordSS}</beans:value>
</beans:property>
</beans:bean>
2.配置多个sessionFactory
<!-- mysql session工厂 -->
<beans:bean id="sessionFactoryMysql"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">
${dataSource.dialect}
</beans:prop>
<beans:prop key="hibernate.show_sql">
false
</beans:prop>
</beans:props>
</beans:property>
<beans:property name="packagesToScan">
<beans:list>
<!-- 扫描实体类,model -->
<beans:value>实体类包名</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<!-- SQLServer session工厂 -->
<beans:bean id="sessionFactorySqlServer"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<beans:property name="dataSource" ref="dataSourceSqlserver" />
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">
${dataSource.dialect}
</beans:prop>
<beans:prop key="hibernate.show_sql">
true
</beans:prop>
</beans:props>
</beans:property>
<beans:property name="packagesToScan">
<beans:list>
<!-- 扫描实体类,model -->
<beans:value>实体类包名</beans:value>
</beans:list>
</beans:property>
</beans:bean>
3.配置多个事务
<!-- mysql事务 -->
<beans:bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="sessionFactoryMysql" />
</beans:bean>
<!-- SQLServer事务 -->
<beans:bean id="transactionManagerSS" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="sessionFactorySqlServer" />
</beans:bean>
4.配置多个事务拦截器
<beans:bean id="transactionInterceptorMysql"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<beans:property name="transactionManager" ref="transactionManager" />
<beans:property name="transactionAttributes">
<beans:props>
<beans:prop key="get*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="find*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="query*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="load*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="export*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="save*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="insert*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="update*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="del*">PROPAGATION_REQUIRED</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="transactionInterceptorSqlServer"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<beans:property name="transactionManager" ref="transactionManagerSS" />
<beans:property name="transactionAttributes">
<beans:props>
<beans:prop key="get*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="find*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="query*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="load*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="export*">PROPAGATION_REQUIRED,readOnly</beans:prop>
<beans:prop key="save*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="insert*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="update*">PROPAGATION_REQUIRED</beans:prop>
<beans:prop key="del*">PROPAGATION_REQUIRED</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
5.配置多个事务拦截器
<beans:bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<beans:property name="beanNames">
<beans:list>
<beans:value>事务加载的类</beans:value>
</beans:list>
</beans:property>
<beans:property name="interceptorNames">
<beans:list>
<beans:value>transactionInterceptorMysql</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<beans:property name="beanNames">
<beans:list>
<beans:value>事务加载的类</beans:value>
</beans:list>
</beans:property>
<beans:property name="interceptorNames">
<beans:list>
<beans:value>transactionInterceptorSqlServer</beans:value>
</beans:list>
</beans:property>
</beans:bean>
备注:
在applicationContext-basicData.xml配置dao类的时候注入的sessionfactory不同