动态切换数据源

西秦月影 贡献于2016-11-09

作者 ZHHUI  创建于2012-11-11 03:56:00   修改者zhonghui  修改于2012-11-13 08:11:00字数3532

文档摘要:动态切换数据源解决方案需求:数据统计需要从多个数据库中获取数据然后汇总,这样就涉及到需要从多个数据源中获取数据的问题,而且程序中需要动态进行切换,以来回的从不同数据库中获取需要的数据。
关键词:

动态切换数据源解决方案 需求:数据统计需要从多个数据库中获取数据然后汇总,这样就涉及到需要从多个数据源中获取数据的问题,而且程序中需要动态进行切换,以来回的从不同数据库中获取需要的数据。 方案:Spring提供了一个抽象类AbstractRoutingDataSource,为我们很方便的解决了这个问题。 步骤: 1. 写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法。 // TODO crm中代码 public class DynamicDataSource extends AbstractRoutingDataSource { private static Log log = LogFactory.getLog(DynamicDataSource.class); @Override protected Object determineCurrentLookupKey() { String dataSourceName = DbContextHolder.getDbType(); if (dataSourceName != null) {// 如果dataSourceName==null則會使用默认的数据源 log.info("======user the datasource : [" + dataSourceName + "]======"); } return dataSourceName; } } 2. 由于切换数据源设计到并发的问题,多个登录用户可能需要同时切换数据源。所以这里需要写一个线程安全的ThreadLocal。 public class DbContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal(); public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { return (String) contextHolder.get(); } public static void clearDbType() { contextHolder.remove(); } 3. DataSource的配置 com.mysql.jdbc.Driver ${jdbcUrl} ${username} ${password} 25 3 1800 3600 oracle.jdbc.driver.OracleDriver ${jdbcUrlOracle} ${usernameOracle} ${passwordOracle} 25 3 1800 3600 4. 当需要切换数据源时,只要调用一行代码就可以了 DbContextHolder.setDbType("dataSourceOracle"); 这里需要注意,需要写上try/catch结构,发生任何异常都要切换回来,保证其他功能能够正常运行。如下: DbContextHolder.setDbType("dataSourceOracle"); try { custCurrentCosts = custCurrentCostDao.getCurrentCosts(query); } catch (Exception e) { e.printStackTrace(); } finally { DbContextHolder.setDbType("dataSource"); } 如果不想在代码中写入这样的一段与业务无关的逻辑,可以采用aop的方式去自动切换数据源。 5. 数据源在jdbc.properties中配置 例如: jdbcUrl=jdbc:mysql://[ip]:[port]/database_name?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull username=xxx password=xxx jdbcUrlOracle=jdbc:oracle:thin:@ [ip]:[port]: another_database_name usernameOracle=xxx passwordOracle=xxx

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档