多數據源配置

        在做項目的過程中, 需要對接一家醫院的數據, 院方直接把數據庫扔給我們了, 看了一下, 是mysql, 有3個庫, 在詢問後得知, 因爲醫院的數據量較大, 每年都會新建一個庫, 但是表結構是一樣的, 我們的需求是要取出每年的員工查體信息.

        在這麼一個需求背景下, 查找資料後決定新搭建一箇中間項目, 用於獲取數據以webService方式傳遞給主項目.

        1> 配置數據源:

        <!-- 健康查體2015年數據源 -->
	<bean id="xxx2015" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<!-- 數據庫基本信息配置 -->
		<property name="url" value="${url_xxx2015}" />
		<property name="username" value="${username_xxx2015}" />
		<property name="password" value="${password_xxx2015}" />
		<property name="driverClassName" value="${driverClassName_xxx2015}" />
		
		<property name="filters" value="${filters}" />
		<!-- 最大併發連接數 -->
		<property name="maxActive" value="${maxActive}" />
		<!-- 初始化連接數量 -->
		<property name="initialSize" value="${initialSize}" />
		<!-- 配置獲取連接等待超時的時間 -->
		<property name="maxWait" value="${maxWait}" />
		<!-- 最小空閒連接數 -->
		<property name="minIdle" value="${minIdle}" />
		<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
		<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
		<property name="validationQuery" value="${validationQuery}" />
		<property name="testWhileIdle" value="${testWhileIdle}" />
		<property name="testOnBorrow" value="${testOnBorrow}" />
		<property name="testOnReturn" value="${testOnReturn}" />
		<property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" />
		<!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
		<property name="poolPreparedStatements" value="${poolPreparedStatements}" />
		<property name="maxPoolPreparedStatementPerConnectionSize"
			value="${maxPoolPreparedStatementPerConnectionSize}" />
		<!-- 打開removeAbandoned功能 -->
		<property name="removeAbandoned" value="${removeAbandoned}" />
		<!-- 1800秒,也就是30分鐘 -->
		<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
		<!-- 關閉abanded連接時輸出錯誤日誌 -->
		<property name="logAbandoned" value="${logAbandoned}" />
	</bean>
        <bean id="dynamicDataSource" class="com.xxx.utils.datasource.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<!-- 指定lookupKey和與之對應的數據源 -->
				<entry key="xxx2015" value-ref="xxx2015"></entry>
				<entry key="xxx2016" value-ref="xxx2016"></entry>
				<entry key="xxx2017" value-ref="xxx2017"></entry>
			</map>
		</property>
		<!-- 這裏可以指定默認的數據源 -->
		<property name="defaultTargetDataSource" ref="xxx2017" />
	</bean>

        2> db.properties

#mysql_1數據源
url_xxx2015:jdbc:mysql://11.11.11.111:3306/xxx2015?useUnicode=true&characterEncoding=UTF8
username_xxx2015:xxxx
password_xxx2015:xxxx
driverClassName_xxx2015:com.mysql.jdbc.Driver
#mysql_2數據源
url_xxx2016:jdbc:mysql://11.11.11.111:3306/xxx2016?useUnicode=true&characterEncoding=UTF8
username_xxx2016:xxxx
password_xxx2016:xxxx
driverClassName_xxx2016:com.mysql.jdbc.Driver

        3> service

@Service
@WebService
public class FWHospitalServiceImpl implements FWHospitalService {
	@Autowired
	DaoSupport dao;
	/**
	 * 根據用戶工號查詢體檢信息
	 * 創建人: mxs
	 * 創建時間: 2017年12月15日
	 */
	@SuppressWarnings("unchecked")
	@Override
	public byte[] listVoByUserId(String userId,String dataSource) throws Exception {
		
		DynamicDataSourceHolder.setDataSource(dataSource); // 動態設置數據源
		System.out.println(DynamicDataSourceHolder.getDataSource());
		List<QueryVo> list = (List<QueryVo>) dao.findForList("FWHospitalMapper.listVoByUserId", userId);// 查詢數據庫返回信息


		// 序列化結果集後再傳輸, 可以大幅度提高webservice傳輸效率, 調用者需要反序列化
		byte[] bytes = null;      
        	ByteArrayOutputStream bos = new ByteArrayOutputStream();      
        	try {        
         		ObjectOutputStream oos = new ObjectOutputStream(bos);         
            		oos.writeObject(list);        
            		oos.flush();         
            		bytes = bos.toByteArray ();      
            		oos.close();         
            		bos.close();        
        	} catch (IOException ex) {        
            		ex.printStackTrace();   
        	}      
		DynamicDataSourceHolder.clearDataSource(); // 清空綁定的數據源
        	return bytes;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章