java程序员在面试中被问到如何配置多数据源以及如何配置多数据源下的分布式事务,该怎么回答?看清再做答

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java程序员在面试中被问到如何配置多数据源以及如何配置多数据源下的分布式事务,该怎么回答?看清再做答相关的知识,希望对你有一定的参考价值。

面试官问我:在spring的环境下 如何配置多数据源?假设数据层采用的是hibernate或mybatis

配置了多数据源后又如何配置分布式事务?

请详细回答两个问题 给了不少分呢

你好,我来先回答你的第一个问题:
通常多数据源,在spring中配置如下,如果你想切换环境ENV 的值,在property中
<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"></property>
<property name="ignoreUnresolvablePlaceholders" value="true"></property>
<property name="nullValue" value="NULL"></property>
<property name="locations">
<list>
<value>jdbc.properties</value>
</list>
</property>
</bean>

<bean id="dataSource" class="com.spring.dao.JDBCConfig">
<property name="driverClassName" value="$$Env.jdbc.driverClassName"></property>
<property name="url" value="$$Env.jdbc.url"></property>
<property name="username" value="$$Env.jdbc.username1"></property>
<property name="password" value="$$Env.jdbc.password"></property>
</bean>

jdbc.properties
*****************************
Env=PROD

jdbc.driverClassName=$$Env.jdbc.driverClassName
jdbc.url=$$Env.jdbc.url
jdbc.username=$$Env.jdbc.username
jdbc.password=$$Env.jdbc.password

######### JDBC Configuration for DEV Environment ###############
DEV.jdbc.driverClassName=com.mysql.jdbc.Driver
DEV.jdbc.url=jdbc:mysql://localhost:3306/devportal
DEV.jdbc.username=DEVuser
DEV.jdbc.password=DEVpwd

######### JDBC Configuration for UAT Environment ############
UAT.jdbc.driverClassName=com.mysql.jdbc.Driver
UAT.jdbc.url=jdbc:mysql://localhost:3306/UATportal
UAT.jdbc.username=UATuser
UAT.jdbc.password=UATpwd

########## JDBC Configuration for PROD Environment ############
PROD.jdbc.driverClassName=com.mysql.jdbc.Driver
PROD.jdbc.url=jdbc:mysql://localhost:3306/portal
PROD.jdbc.username=root
PROD.jdbc.password=admin,
我这里有三套环境,分别是DEV,UAT和PROD,这种方式可以灵活切换的。

我再回答你的第二个问题:
还请你去http://docs.spring.io/spring-framework/docs/4.0.x/spring-framework-reference/html/transaction.html这里看下,很详细,不过是英文的哦
参考技术A 1、使用了spring的aop思想,实现了动态数据源的切换。
2、spring的事务管理,是基于数据源的,所以如果要实现动态数据源切换,而且在同一个数据源中保证事务是起作用的话,就需要注意二者的顺序问题,即:在事物起作用之前就要把数据源切换回来。
举一个例子:web开发常见是三层结构:controller、service、dao。一般事务都会在service层加的,如果使用spring的声明式事物管理,那么在调用service层代码之前,spring会通过aop的方式动态添加事务控制代码,所以如果要想保证事物是有效的,那么必须spring添加事务之前把数据源动态切换过来,也就是动态切换数据源的aop要至少在service上添加,而且要在spring声明式事物aop之前添加。
最简单的方式是,把动态切换数据源的aop加到controller层,这样在controller层里面就可以确定下来数据源了。不过,这样有一个缺点就是,每一个controller绑定了一个数据源,不灵活。对于这种:一个请求,需要使用两个以上数据源中的数据完成的业务,就无法实现了。
针对上面的这种问题,可以考虑把动态切换数据源的aop放到service层,但要注意一定要在事务aop之前来完成。这样,对于一个需要多个数据源数据的请求,我们只需要在controller里面注入多个service实现即可。但这种做法的问题在于,controller层里面会涉及到一些不必要的业务代码,例如:合并两个数据源中的list...
针对上面的问题,可以再考虑一种方案,就是把事务控制到dao层,然后在service层里面动态切换数据源。

Java面试中被问到过哪些问题基础篇


长按可保存到手机相册~~


你可能感兴趣:







尚学堂4月开班时间


Java零基础就业–脱产班:04月10日


Java零基础就业–脱产班:04月24日


课程内容:Java EE 基础入门到精通


招生对象

  1. 零计算机编程基础学

  2. 对行业不满意人士

  3. 跨专业编程爱好者

  4. 在校大学生实训


Java零基础班,10年以上开发经验技术讲师、架构师、行业大牛,亲自纯面授课程,手把手教你写编程。


尚学堂春季班免费试听课已就绪,7天免费听课,组团试听更有专车接送,体验Java乐趣,确定自己对编程感兴趣,再报名。


点击下方“阅读原文”即可预约试听~~



以上是关于java程序员在面试中被问到如何配置多数据源以及如何配置多数据源下的分布式事务,该怎么回答?看清再做答的主要内容,如果未能解决你的问题,请参考以下文章

Java面试中被问到过哪些问题基础篇

[文末赠书]面试被问到Flutter/Dart的HashMap你会吗?

面试时被问到Flutter/Dart的HashMap怎么办?

286期面试时被问到Flutter/Dart的HashMap怎么办?

Java开发篇——设计模式面试被问工厂模式?不要怕看这里!

去年去阿里面试,被问到java 多线程,我是这样手撕面试官的