spring 整合mybatis——多資料來源切換(附帶定時器的配置,儲存過程連線,資料多於50條,分批進行操作)
阿新 • • 發佈:2018-12-12
新建com.millery.utils包在其下新建DataSourceContextHolder類
package com.millery.utils; public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { return ((String) contextHolder.get()); } public static void clearDbType() { contextHolder.remove(); } }
新建DataSourceContextHolder類
package com.millery.utils; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDbType(); } }
配置mybatis
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<!-- 自動掃描 -->
<context:component-scan base-package="com.hqgf" />
<!-- 引入配置檔案 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<!-- <util:properties id="APP_PROPERTIES" location="classpath:attendance.properties" local-override="true"/> -->
<bean id="HrtestSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://172.69.1.236;DatabaseName=LongshineWebHr" />
<property name="username" value="sa" />
<property name="password" value="Hqmart88" />
</bean>
<bean id="HrSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://172.88.10.161;DatabaseName=LongshineWebHr " />
<property name="username" value="sa" />
<property name="password" value="Hqmart88" />
</bean>
<bean id="AttendanceSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://172.69.1.8:3306/hws_sqlservice?useUnicode\=true;characterEncoding\=utf-8" />
<property name="username" value="root" />
<property name="password" value=" [email protected]" />
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置對映檔案 -->
<bean id="dataSource" class="com.millery.utils.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="HrtestSource" key="HrtestSource"></entry>
<entry value-ref="HrSource" key="HrSource"></entry>
<entry value-ref="AttendanceSource" key="AttendanceSource"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="HrtestSource"></property><!-- 預設使用HrtestSource的資料來源 -->
</bean>
<!-- 2. mybatis 的SqlSession 的工廠: SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:com/hqgf/mapping/*.xml"/>
</bean>
<!-- 3. mybatis 自動掃描載入Sql 對映檔案 : MapperScannerConfigurer -->
<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean> -->
<!-- 4. 事務管理 : DataSourceTransactionManager -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 5. 使用宣告式事務 -->
<tx:annotation-driven transaction-manager="txManager" />
<!-- 資料抓取任務 -->
<!-- 任務實體 -->
<bean id="eleTaskBean" class="com.hqgf.attendanceupload.HwsTimeTask" />
<bean id="eletasktimingmethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="eleTaskBean" />
<!-- targetMethod 配置定時執行的方法名 -->
<property name="targetMethod" value="TimeTaskData" />
<property name="concurrent" value="false" />
</bean>
<!-- 設定每天凌晨兩點執行定時任務 -->
<bean id="eleTaskTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="eletasktimingmethod" />
<property name="cronExpression" value="01 50 16 * * ?" />
</bean>
<!-- 訂製任務列表 -->
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="eleTaskTrigger" />
</list>
</property>
</bean>
</beans>
每個mapper呼叫之前
/**
* @author ldq
* 轉正審批
* 切換資料庫《HR系統資料庫》
* 2018年2月27日11:24:09
*/
@Override
public void turnPositive(Map<String, Object> tmso) throws Exception {
//資料庫統一配置檔案
Properties prop = new Properties();
InputStream is = this.getClass().getResourceAsStream("/multi-database.properties");
prop.load(is);
is.close();
String database = prop.getProperty("databasename");
DataSourceContextHolder.setDbType(database);
getSqlSession().insert("com.hqgf.dao.ISyncOaDao.turnPositive",tmso);
}
資料庫切換成功。
<!-- HR考勤資料儲存過程 -->
<insert id="Storedprocedure" parameterType="java.util.Map" statementType="CALLABLE">
<![CDATA[
{ call Hq_Attendance
(
#{A0188,mode=IN,jdbcType=VARCHAR},
#{CARD_TIME,mode=IN,jdbcType=VARCHAR},
#{ACTIONTIME,mode=IN,jdbcType=VARCHAR}
)
}
]]>
</insert>
///////////如果資料多於50條,分批進行操作
int batchnumber = 50;
int opnumber = (int) Math.ceil((double) mso.size()
/ (double) batchnumber);
for (int j = 0; j < opnumber; j++) {
List<Map<String, Object>> lop = new ArrayList<Map<String, Object>>();
for (int k = 0; k < batchnumber; k++) {
if ((j * batchnumber + k) < mso.size()) {
lop.add(mso.get(j * batchnumber + k));
} else {
break;
}
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("m", lop);
getSqlSession().insert(
"com.hqgf.dao.IUploadAttendanceDao.extractData", map);
}