A. java程序员在面试中被问到如何配置多数据源以及如何配置多数据源下的分布式事务,该怎么回答看清再做答
你好,我来先回答含枣你的第一个问题:
通常多梁老悔数据源,在spring中配置如下,如果你想橡正切换环境ENV 的值,在property中
<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"></property>
<property name="" 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..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这里看下,很详细,不过是英文的哦
B. 请问各位大神,java如何实现同时支持多种数据库啊
Java连数据库不管用不用框架底层都是JDBC,而JDBC对每种类型数据库需要重新配置驱动,多个数据库同时用就没法单独使用连接池了,每个数据库都要打开自己的连接池的。你可以考虑自己写一个适配器层接口和实现,实现里面写连接多种数据库的逻辑,在里面调用原生JDBC代码或Hibernate, MyBatis那些框架都可以,这样上面那些层都不用改变了。
就像下面这个(示例,只写了查,用Hibernate,其他类似):
public interface MultiTypeDBSupport {
public List getData();
// ...
}
public class MultiTypeDBSupportImpl implements MultiTypeDBSupport {
public SessionFactory getSessionFactory(Stirng configFile){
SessionFactory sessionFactory = Configuration().config(configFile).buildSessionFactory();
}
public List getData(){
SessionFactory sessionFactoryMySQL = getSessionFactory("hibernateMySQL.cfg.xml");
Session sessionMySQL = sessionFactoryMySQL.openSession();
List users1 = sessionMySQL.createQuery("from User");
SessionFactory sessionFactoryOracle = getSessionFactory("hibernateOracle.cfg.xml");
Session sessionOracle = sessionFactoryOracle.openSession();
List users2 = sessionOracle.createQuery("from User");
users1.addAll(users2);
return users1;
}
// .......
}
C. 濡备綍鍦╯pring妗嗘灦涓瑙e喅澶氭暟鎹婧愮殑闂棰
銆銆鎴戦栧厛𨱍冲埌鍦╯pring镄刟pplicationContext涓閰岖疆镓链夌殑dataSource銆傝繖浜沝ataSource鍙鑳芥槸钖勭崭笉钖岀被鍨嬬殑锛屾瘆濡备笉钖岀殑鏁版嵁搴掳细Oracle銆丼QL Server銆丮ySQL绛夛纴涔熷彲鑳芥槸涓嶅悓镄勬暟鎹婧愶细姣斿俛pache 鎻愪緵镄刼rg.apache.commons.dbcp.BasicDataSource銆乻pring鎻愪緵镄刼rg.springframework.jndi.JndiObjectFactoryBean绛夈傜劧钖巗essionFactory镙规嵁瀹㈡埛镄勬疮娆¤锋眰锛屽皢dataSource灞炴ц剧疆鎴愪笉钖岀殑鏁版嵁婧愶纴浠ュ埌杈惧垏鎹㈡暟鎹婧愮殑鐩镄勚
銆銆浣嗘槸锛屾垜寰埚揩鍙戠幇涓涓闂棰桡细褰揿氱敤鎴峰悓镞跺苟鍙戣块梾鏁版嵁搴撶殑镞跺欎细鍑虹幇璧勬簮浜夌敤镄勯梾棰樸傝繖閮芥槸钬滃崟渚嬫ā寮忊濇児镄勭ジ銆备䌷镓锻ㄧ煡锛屾垜浠鍦ㄤ娇鐢╯pring妗嗘灦镄勬椂鍊欙纴鍦╞eanFactory涓娉ㄥ唽镄刡ean锘烘湰涓婇兘鏄閲囩敤鍗曚緥妯″纺锛屽嵆spring鍦ㄥ惎锷ㄧ殑镞跺欙纴杩欎簺bean灏辫呰浇鍒板唴瀛树腑锛屽苟涓旀疮涓狰ean鍦ㄦ暣涓椤圭洰涓鍙瀛桦湪涓涓瀵硅薄銆
銆銆姝e洜涓哄彧瀛桦湪涓涓瀵硅薄锛屽硅薄镄勬墍链夊睘镐э纴镟村嗳纭璇存槸瀹炰緥鍙橀噺锛岃〃鐜板缑灏卞傚悓鏄涓闱欐佸彉閲忥纸瀹为檯涓娾滈润镐佲濅笌钬滃崟渚嬧濆线寰鏄闱炲父鐩镐技镄勪袱涓涓滆タ锛屾垜浠甯稿父鐢ㄢ滈润镐佲濇潵瀹炵幇钬滃崟渚嬧濓级銆傛嬁鎴戜滑镄勯梾棰樻潵璇达纴sessionFactory鍦ㄦ暣涓椤圭洰涓鍙链変竴涓瀵硅薄锛屽畠镄勫疄渚嫔彉閲厅ataSource涔熷氨鍙链変竴涓锛屽氨濡傚悓涓涓闱欐佸彉閲忎竴鑸銆傚傛灉涓嶅悓镄勭敤鎴烽兘涓嶆柇鍦板幓淇鏀筪ataSource镄勫硷纴蹇呯劧浼氩嚭鐜板氱敤鎴蜂簤鐢ㄤ竴涓鍙橀噺镄勯梾棰桡纴瀵圭郴缁熶骇鐢熼殣鎭c
銆銆阃氲繃浠ヤ笂镄勫垎鏋愶纴瑙e喅澶氭暟鎹婧愯块梾闂棰樼殑鍏抽敭锛屽氨闆嗕腑鍦╯essionFactory鍦ㄦ墽琛屾暟鎹鎸佷箙鍖栫殑镞跺欙纴鑳藉熼氲繃镆愭典唬镰佸幓镙规嵁瀹㈡埛镄勯渶瑕佸姩镐佸垏鎹㈡暟鎹婧愶纴骞惰В鍐宠祫婧愪簤鐢ㄧ殑闂棰樸
D. Java连接多个数据库有什么开源实现吗
对于一个应用连接多个数据库的问题,如果是因为数据量大而分库形成的多个数据库,可以在数据库的层面使用分布式中间件,比如:cobar或amoba都可以。
如果是分表形成的多库,则建议使用原生的jdbc或Spring配置多个数据源,根据业务逻辑,通过代码动态查询。