在做項目的過程中, 需要對接一家醫院的數據, 院方直接把數據庫扔給我們了, 看了一下, 是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;
}
}