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配置多個數據源,根據業務邏輯,通過代碼動態查詢。