spring 訪問多個數據源(jdbcUrl寫死)
阿新 • • 發佈:2019-02-11
1.資料來源配置
2.資源配置檔案conf.properties<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 自動掃描bean --> <context:component-scan base-package="com.sq.platform.testData"/> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:conf/conf.properties</value> </list> </property> </bean> <bean id="dataSourceOne" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${drivenClassName}" p:url="${jdbcUrlOne}" p:username="${user}" p:password="${password}" /> <bean id="dataSourceTwo" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${drivenClassName}" p:url="${jdbcUrlTwo}" p:username="${user}" p:password="${password}" /> <bean id="dynamicDataSource" class="com.sq.platform.testData.dao.DynamicDataSource" > <!-- 通過key-value的形式來關聯資料來源 --> <property name="targetDataSources"> <map> <entry value-ref="dataSourceOne" key="one"></entry> <entry value-ref="dataSourceTwo" key="Two"></entry> </map> </property> <property name="defaultTargetDataSource" ref="dataSourceOne" /> </bean> <!--JdbcTemplate使用動態資料來源的配置--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dynamicDataSource" /> </property> </bean> </beans>
#***************database configure************************
drivenClassName=org.postgresql.Driver
jdbcUrlOne=jdbc:xxxx
jdbcUrlTwo=jdbc:xxxxx
user=admin
password=admin
3.建立兩個類DBContextHolder.java 和 DynamicDataSource.java
package com.sq.platform.testData.dao; public class DBContextHolder{ public static final String OneUrl= "one"; public static final String TwoUrl= "two"; private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDBType(String dbType) { contextHolder.set(dbType); } public static String getDBType() { return contextHolder.get(); } public static void clearDBType() { contextHolder.remove(); } }
4.呼叫方法,每次呼叫jdbc之前需要設定資料來源package com.sq.platform.testData.dao; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DBContextHolder.getDBType(); } }
@Autowired
private JdbcTemplate jdbcTemplate;
public void insertData(String tableName, int value_id, float value, String sampleTime){
String sql = "insert into " + tableName+ " values(?,?,?)";
DBContextHolder.setDBType(DBContextHolder.OneUrl);
jdbcTemplate.update(sql, new Object[]{value_id, value, sampleTime}, new int[]{Types.INTEGER, Types.FLOAT, Types.TIMESTAMP});
}