博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于druid和spring的动态数据库以及读写分离
阅读量:6231 次
发布时间:2019-06-21

本文共 3649 字,大约阅读时间需要 12 分钟。

hot3.png

spring与druid可以实现动态数据源,夸库查询,读写分离等功能。现在说一下配置:

1、需要配置多个spring数据源

spring-data.xml

 2、需要写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法

 

 

public class DynamicDataSource extends AbstractRoutingDataSource {  	          /**      *       * override determineCurrentLookupKey      * 

* Title: determineCurrentLookupKey *

*

* Description: 自动查找datasource *

* * @return */ @Override protected Object determineCurrentLookupKey() { return DBContextHolder.getDSType(); } }

 

 

3、参考spring事务管理,使用线程变量来切换数据源

 

public class DBContextHolder {	/**	 * 线程threadlocal	 */	private static ThreadLocal
contextHolder = new ThreadLocal<>(); private static Logger logger = LoggerFactory .getLogger(DBContextHolder.class); public static String getDSType() { try { } catch (Exception e) { e.printStackTrace(); logger.error("get DBTYPE faild with error:[" + e.getMessage() + "]"); } String db = contextHolder.get(); if (db == null) { db =UrlConnect.getKey(ConfigHelper.getToWriteKey());// 默认是读写库 } return db; } /** * * 设置本线程的dbtype * * @param str * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static boolean setDSType(String str) { try { clearDBType(); if (str != null&&!str.equals("")) { contextHolder.set(str); logger.info("change thread[" + str + "] success!"); return true; } else { logger.info("change thread[" + str + "] faild!"); return false; } } catch (Exception e) { e.printStackTrace(); logger.error("change thread[" + str + "] faild!"); return false; } } /** * clearDBType * * @Title: clearDBType * @Description: 清理连接类型 */ public static void clearDSType() { contextHolder.remove(); }}

 

 

4、在dao中切换数据源

@Repositorypublic class BaseDAO extends SqlSessionDaoSupport {       @Resource	private SqlSessionTemplate sqlSessionTemplate;@Resource	public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {		super.setSqlSessionTemplate(sqlSessionTemplate);	}public  
PageList
selectPublicListPage(String countSqlID,String sqlID, PageList
page, Object obj) { DBContextHolder.setDbType("dataSourceRead"); //查询总数 Integer total = this.getSqlSession().selectOne(countSqlID, obj); RowBounds rowBounds=new RowBounds(page.getFirstResult(),page.getPageSize()); // 查询列表信息 List
list = this.getSqlSession().selectList( sqlID, obj,rowBounds); page.setTotalRecord(total!=null?total:0); page.setDataSource(list); page.setTotalPage((total + page.getPageSize() - 1) / page.getPageSize()); return page; } public int insert(String sqlID, Object paramObj) { DBContextHolder.setDbType("dataSourceWrite"); return this.getSqlSession().insert(sqlID, paramObj); }}

 

 

 

 

 

转载于:https://my.oschina.net/u/560547/blog/1543074

你可能感兴趣的文章
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
查看>>
JavaScript 数据类型
查看>>
量子通信和大数据最有市场突破前景
查看>>
对‘初学者应该选择哪种编程语言’的回答——计算机达人成长之路(38)
查看>>
如何申请开通微信多客服功能
查看>>
Sr_C++_Engineer_(LBS_Engine@Global Map Dept.)
查看>>
非监督学习算法:异常检测
查看>>
jquery的checkbox,radio,select等方法总结
查看>>
Linux coredump
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>
我的友情链接
查看>>
nginx在reload时候报错invalid PID number
查看>>
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
VS2010远程调试C#程序
查看>>
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>