SSM+Druid实现动态多数据源切换(已实践)
生活随笔
收集整理的這篇文章主要介紹了
SSM+Druid实现动态多数据源切换(已实践)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
場景
兩個數據庫,完成增刪改查時同時對兩個數據庫進行操作。
實現
1.在web.xml中配置spring的配置文件
<!-- 配置Spring配置文件的位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></context-param>2.在spring.xml中引入屬性文件
<!-- 引入屬性文件 --><context:property-placeholder location="classpath:config.properties" /><context:property-placeholder location="classpath:databaseType.properties" />3.打開config.properties
除了其他正常配置外,添加兩個連接數據庫的url。
添加如下:
driverClassName=com.mysql.jdbc.Driver validationQuery=SELECT 1sys_url=jdbc:mysql://數據庫1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true sys_username= sys_password=demo_url=jdbc:mysql://數據庫2?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true demo_username= demo_password=4.打開databaseType.properties
#sysDs 1 = sysDs #demoDS 2 = demoDs
5.再回到spring.xml
其他配置正常,這里省略。
導入其他spring配置文件
<!-- 導入其他spring配置文件 --><import resource="spring-database.xml" />6.打開spring-database.xml
設置動態切換數據源
<!-- 動態切換數據源 --><bean id="dataSource" class="com.wongoing.datasource.DynamicDataSource"><property name="targetDataSources"><map key-type="java.lang.String"><entry key="sysDs" value-ref="sysDs" /><entry key="demoDs" value-ref="demoDs" /></map></property><!-- 默認數據源 --><property name="defaultTargetDataSource" ref="sysDs" /></bean>緊接著配置兩個數據源
?<!-- 系統庫數據源 --><bean name="sysDs" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="${driverClassName}" /><property name="url" value="${sys_url}" /><property name="username" value="${sys_username}" /><property name="password" value="${sys_password}" /><!-- 初始化連接大小 --><property name="initialSize" value="0" /><!-- 最小空閑連接數 --><property name="minIdle" value="0" /><!-- 連接池最大活躍連接數量 --><property name="maxActive" value="50" /><!-- 獲取連接最大等待時間 --><property name="maxWait" value="60000" /><!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="300000" /><!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><!-- 測試連接,單位為毫秒 --><property name="validationQueryTimeout" value="300000" /><property name="validationQuery" value="${validationQuery}" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" />??<!-- 打開PSCache,并且指定每個連接上PSCache的大小 --><!-- 如果用Oracle,則把poolPreparedStatements配置為true,MySQL可以配置為false --><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="50" /><!-- 打開removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 3600秒,也就是60分鐘 --><property name="removeAbandonedTimeout" value="3600" /><!-- 關閉abanded連接時輸出錯誤日志 --><property name="logAbandoned" value="true" /></bean><!-- 演示數據源 --><bean name="demoDs" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="${driverClassName}" /><property name="url" value="${demo_url}" /><property name="username" value="${demo_username}" /><property name="password" value="${demo_password}" /><!-- 初始化連接大小 --><property name="initialSize" value="0" /><!-- 最小空閑連接數 --><property name="minIdle" value="0" /><!-- 連接池最大活躍連接數量 --><property name="maxActive" value="50" /><!-- 獲取連接最大等待時間 --><property name="maxWait" value="60000" /><!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="300000" /><!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><!-- 測試連接,單位為毫秒 --><property name="validationQueryTimeout" value="300000" /><property name="validationQuery" value="${validationQuery}" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" />??<!-- 打開PSCache,并且指定每個連接上PSCache的大小 --><!-- 如果用Oracle,則把poolPreparedStatements配置為true,MySQL可以配置為false --><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="50" /><!-- 打開removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 3600秒,也就是60分鐘 --><property name="removeAbandonedTimeout" value="3600" /><!-- 關閉abanded連接時輸出錯誤日志 --><property name="logAbandoned" value="true" /></bean>然后配置事務管理
???
<!-- 開啟事務注解驅動 -->?<tx:annotation-driven />?<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->?<bean id="transactionManager"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager">?<property name="dataSource" ref="dataSource" />?</bean>?7.新建DataSourceHolder類
新建datasource包 ,包下新建DataSourceHolder.java
package com.badao.datasource;public class DataSourceHolder {//線程本地環境private static final ThreadLocal<String> dataSources = new ThreadLocal<String>();//設置數據源public static void setDataSource(String customerType) {dataSources.set(customerType);}//獲取數據源public static String getDataSource() {return (String) dataSources.get();}//清除數據源public static void clearDataSource() {dataSources.remove();} }8.業務實現
import com.badao.datasource.DataSourceHolder;@Description("信息保存")@ResponseBody@RequestMapping(value = "/doSave")public Map<String, Object> doSave(TbMessage entity, String op, String base64Str, String[] itemIdStr) {Map<String, Object> jsonResult = null;String msg = "";try {if (base64Str.length()!= 0) {String result = ImageUtil.getInstance().baseUploadImg(Constants.UPLOAD_IMG_MESSAGE, base64Str);entity.setThemeImageUrl((String) result);}String tabid = tabid(ModelAndViewConstants.MESSAGE_SYS_ID);Date now = new Date();ShiroUser currentUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();// 添加if (null == op || ModelAndViewConstants.OPERATION_VALUE_ADD.equals(op)) {entity.setStatus("0");entity.setRecordTime(now);entity.setUserId(currentUser.getUserId());this.service.insert(entity);DataSourceHolder.setDataSource("demoDs");//切換云端數據源this.service.insert(entity);DataSourceHolder.setDataSource("sysDs");//切換本地數據源} else {// 編輯entity.setModifyDate(now);this.service.updateByPrimaryKey(entity);DataSourceHolder.setDataSource("demoDs");//切換云端數據源this.service.updateByPrimaryKey(entity);DataSourceHolder.setDataSource("sysDs");//切換本地數據源}Integer statusCode = 200;String Msg = "消息信息保存成功";jsonResult = JsonResult.jsonReturn(statusCode, Msg, tabid);return jsonResult;} catch (Exception e) {msg = "接口調用異常";jsonResult = JsonResult.jsonWsReturn(1, msg, e.getMessage());LogService.getInstance(this).error("保存消息信息失敗" + e.getMessage());String mg = "保存消息信息失敗:" + e.getMessage();jsonResult = JsonResult.jsonReturnErr(mg);return jsonResult;}}?
總結
以上是生活随笔為你收集整理的SSM+Druid实现动态多数据源切换(已实践)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat下server.xml怎样处
- 下一篇: Eclipse新建SpringBoot后