Spring配置多个数据源并实现动态切换示例
程序员文章站
2024-03-01 16:34:58
1.配置两个不同的数据源,如下(由于项目使用的是druid数据库连接,配置可以会复杂点比较):
1.配置两个不同的数据源,如下(由于项目使用的是druid数据库连接,配置可以会复杂点比较):
<!-- 数据源配置1 --> <bean id="testdatasource1" class="com.alibaba.druid.pool.druiddatasource" init-method="init" destroy-method="close"> <property name="driverclassname" value="${db.driver}" /> <property name="url" value="${unity.db.jdbc.url}" /> <property name="username" value="${db.login.name}"></property> <property name="password" value="${db.login.password}" /> <property name="filters" value="${db.filters}"></property> <property name="maxactive" value="${db.pool.maxactive}"></property> <property name="initialsize" value="${db.pool.initialsize}"></property> <property name="minidle" value="${db.pool.minidle}"></property> <property name="maxwait" value="${db.maxwait}"></property> <property name="timebetweenevictionrunsmillis" value="${db.timebetweenevictionrunsmillis}"></property> <property name="minevictableidletimemillis" value="${db.minevictableidletimemillis}"></property> <property name="validationquery" value="${db.validationquery}"></property> <property name="testwhileidle" value="${db.testwhileidle}"></property> <property name="testonborrow" value="${db.testonborrow}"></property> <property name="testonreturn" value="${db.testonreturn}"></property> <property name="poolpreparedstatements" value="${db.poolpreparedstatements}"></property> <property name="maxopenpreparedstatements" value="${db.maxopenpreparedstatements}"></property> <!-- 监控数据库 --> <property name="proxyfilters"> <list> <ref bean="log-filter" /> </list> </property> </bean>
<!-- 数据源配置2 --> <bean id="testdatasource2" class="com.alibaba.druid.pool.druiddatasource" init-method="init" destroy-method="close"> <property name="driverclassname" value="${db.driver}" /> <property name="url" value="${pub.db.jdbc.url}" /> <property name="username" value="${db.login.name}"></property> <property name="password" value="${db.login.password}" /> <property name="filters" value="${db.filters}"></property> <property name="maxactive" value="${db.pool.maxactive}"></property> <property name="initialsize" value="${db.pool.initialsize}"></property> <property name="minidle" value="${db.pool.minidle}"></property> <property name="maxwait" value="${db.maxwait}"></property> <property name="timebetweenevictionrunsmillis" value="${db.timebetweenevictionrunsmillis}"></property> <property name="minevictableidletimemillis" value="${db.minevictableidletimemillis}"></property> <property name="validationquery" value="${db.validationquery}"></property> <property name="testwhileidle" value="${db.testwhileidle}"></property> <property name="testonborrow" value="${db.testonborrow}"></property> <property name="testonreturn" value="${db.testonreturn}"></property> <property name="poolpreparedstatements" value="${db.poolpreparedstatements}"></property> <property name="maxopenpreparedstatements" value="${db.maxopenpreparedstatements}"></property> <!-- 监控数据库 --> <property name="proxyfilters"> <list> <ref bean="log-filter" /> </list> </property> </bean>
2.定义一个类继承abstractroutingdatasource实现determinecurrentlookupkey方法,该方法可以实现数据库的动态切换,如下:
public class dynamicdatasource extends abstractroutingdatasource { @override protected object determinecurrentlookupkey() { return datasourcecontextholder.getdatasourcetype(); } }
3.定义一个可以设置当前线程的变量的工具类,用于设置对应的数据源名称:
public class datasourcecontextholder { private static final threadlocal<string> contextholder = new threadlocal<string>(); /** * @description: 设置数据源类型 * @param datasourcetype 数据库类型 * @return void * @throws */ public static void setdatasourcetype(string datasourcetype) { contextholder.set(datasourcetype); } /** * @description: 获取数据源类型 * @param * @return string * @throws */ public static string getdatasourcetype() { return contextholder.get(); } /** * @description: 清除数据源类型 * @param * @return void * @throws */ public static void cleardatasourcetype() { contextholder.remove(); } }
然后在spring中配置,如下:
<!-- 编写spring 配置文件的配置多数源映射关系 --> <bean class="com.sino.access.database.dynamicdatasource" id="datasource"> <property name="targetdatasources"> <map key-type="java.lang.string"> <entry value-ref="testdatasource1" key="<span style="font-family: arial, helvetica, sans-serif;">testdatasource1</span><span style="font-family: arial, helvetica, sans-serif;">"></entry></span> <entry value-ref="testdatasource2" key="testdatasource2"></entry> </map> </property> <property name="defaulttargetdatasource" ref="testdatasource1"> </property> </bean> </bean>
这样配置两个数据源对应的key分别为testdatasource1和testdatasource2,默认数据库是testdatasource。
4.完成以上步骤后,如果没有数据库的事务管理,已经可以实现数据库的动态切换了。但是如果涉及到数据库的事务管理,需要在数据库事务开启切换数据库,
否则数据库的切换只能在下次数据库操作时才生效。可以定义一个aop处理类在数据库事务开启之前切换数据库,如下:
public class datasourceaspect implements methodbeforeadvice,afterreturningadvice { @override public void afterreturning(object returnvalue, method method, object[] args, object target) throws throwable { // todo auto-generated method stub datasourcecontextholder.cleardatasourcetype(); } @override public void before(method method, object[] args, object target) throws throwable { if (method.isannotationpresent(datasource.class)) { datasource datasource = method.getannotation(datasource.class); datasourcecontextholder.setdatasourcetype(datasource.name()); } else { datasourcecontextholder.setdatasourcetype(sinoconstant.datasourcetype.unitydatasource.tostring()); } } }
5.设置数据库事务切面和切换数据库切面执行的顺序,如下:
<aop:config> <aop:pointcut id="transactionpointcut" expression="execution(* com.test.service.*.*(..))" /> <aop:advisor pointcut-ref="transactionpointcut" advice-ref="txadvice" order="2" /> <aop:advisor advice-ref="datasourceexchange" pointcut-ref="transactionpointcut" order="1"/> </aop:config>
利用aop的order属性设置执行的顺序,这样实现了带事务管理的spring数据库动态切换。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: Python 自动化表单提交实例代码
推荐阅读
-
Spring配置多个数据源并实现动态切换示例
-
Spring + Mybatis 项目实现动态切换数据源实例详解
-
spring boot + mybatis实现动态切换数据源实例代码
-
Spring + Mybatis 项目实现动态切换数据源实例详解
-
spring实现动态切换、添加数据源及源码分析
-
基于spring的aop实现多数据源动态切换 博客分类: javaspring 动态切换springaopAbstractRoutingDataSource
-
Spring整合多数据源实现动态切换的实例讲解
-
Spring整合多数据源实现动态切换的实例讲解
-
SpringMVC+Mybatis 如何配置多个数据源并切换?
-
Spring的JNDI数据源连接池配置示例及Spring对JNDI实现分析