`
zhongxuchen
  • 浏览: 33443 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

请您先登录,才能继续操作

动态数据源

阅读更多

SAGACITY(睿智)框架中的部分逐步介绍!

第二讲:动态数据源

第一讲见: http://www.iteye.com/post/887351 

 

先抛一个问题:

      大家在开发项目时有时候会遇到公司一个环境以及自己电脑一个环境的问题?我们就以数据库为例,白天在公司用公司的数据库,回家时或则到客户现场做演示需要连接本地库,还得手工切换,回到公司还再切换,好麻烦!

      所以我们从人性化的角度(主要还是为了省事),我们开发设计了动态数据库配置方式。

      如下:


 <!-- 数据源的配置 //-->
 <bean id="dataSource" class="org.sagacity.tools.plugin.datasource.DynamicDataSource"
  destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}" />
  <property name="url" value="${release.jdbc.url}" />
  <property name="backUrl" value="${test.jdbc.url}" />
  <!-- 周一到周五 8:30到下午6点半时间范围内优先判断主数据库连接,此范围外优先判断backUrl-->
  <property name="worktime" value="1-5 8:30-18:30" />
  <property name="username" value="${release.jdbc.username}" />
  <property name="password" value="${release.jdbc.password}" />
  <property name="maxIdle" value="10" />
  <property name="minIdle" value="2" />
 </bean>

  以上是基于spring的配置,周一到周五8:30-6点连接公司库,除此之外优先采用backurl对应的库,当然连不上还是会则切换到令一个库的。

我知道大家会产生一个疑问:给客户部署时就这样配置?

当然不是了,难道不会用ant或maven针对测试以及最终上线定义不同的打包方式指定不同的配置文件嘛?

代码如下:(时间格式固定到分钟,肯定有人要问不可以到秒嘛?哦靠,这个东西只实用于开发阶段呀,没有必要过于在意了,如果愿意自己可以扩展)

 

package org.sagacity.tools.plugin.datasource;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.sagacity.framework.utils.DateUtil;
import org.sagacity.framework.utils.StringUtil;

 

/**
 * @project sagacity-core
 * @description:$ <p>
 *                动态数据库连接,提供家庭和工作场所的数据库自动适应, 无须在不同环境下修改配置文件
 *                </p>
 *                $
 * @author Administrator $<a href="mailto:zhongxuchen@hotmail.com">联系作者</a>$
 * @version $id:DynamicDataSource.java,Revision:v1.0,Date:Dec 24, 2008 3:41:03
 *          PM $
 */
public class DynamicDataSource extends BasicDataSource {
 private String backUrl = "";

 /**
  * 工作时间,在此时间之外用backUrl作为数据库连接 默认为周一到周五 8:30到下午6点
  */
 private String worktime = "1-5 8:30-18:00";

 public String getWorktime() {
  return worktime;
 }

 public void setWorktime(String worktime) {
  this.worktime = worktime;
 }

 public String getBackUrl() {
  return backUrl;
 }

 public void setBackUrl(String backUrl) {
  this.backUrl = backUrl;
 }

 

 /**
  * 创建数据库DataSource
  */
 protected synchronized DataSource createDataSource() throws SQLException {
  // 在启用备用地址情况下,先判断连接,首选数据库不能连接时连接备用数据库地址
  if (StringUtil.isNotNullAndBlank(this.backUrl)) {
   String targetUrl;
   boolean useBakUrl = false;
   // 是否为工作时间
   if (isWorkTime())
    targetUrl = this.url;
   else {
    // 非工作时间启用备用数据库连接地址
    targetUrl = this.backUrl;
    useBakUrl = true;
   }
   // 数据库地址不能连接
   if (!validateConnect(targetUrl)) {
    // 没有启用备用地址
    if (!useBakUrl)
     this.url = this.backUrl;
   } else {
    if (useBakUrl)
     this.url = this.backUrl;
   }
  }
  System.out
    .println("#################目前连接数据库URL为############################");
  System.out.println((this.url.equals(this.backUrl) ? "备用数据库" : "主数据库")
    + this.url);
  System.out
    .println("###############################################################");
  return super.createDataSource();
 }

 

 /**
  * 判断数据是否能够连接
  *
  * @return
  */
 private boolean validateConnect(String url) {
  Connection conn = org.sagacity.framework.utils.DBUtil.getConnection(
    this.driverClassName, url, username, password);
  if (conn == null)
   return false;
  conn = null;
  return true;
 }

 

 /**
  * 判断是否为工作时间范围
  *
  * @return
  */
 private boolean isWorkTime() {
  int weekBegin = 1;
  int weekEnd = 5;
  String beginTime = "8:30:00";
  String endTime = "18:00:00";
  String timeStr = worktime.substring(worktime.indexOf(" ") + 1);
  try {
   weekBegin = Integer.parseInt(worktime.substring(0, 1));
   weekEnd = Integer.parseInt(worktime.substring(2, 3));
   beginTime = timeStr.substring(0, timeStr.indexOf("-")) + ":00";
   endTime = timeStr.substring(timeStr.indexOf("-") + 1) + ":00";
  } catch (Exception e) {
   e.printStackTrace();
  }
  int nowDayOfWeek = DateUtil.getDayOfWeek();
  Date nowDate = DateUtil.getNowTime();
  String nowDateStr = DateUtil.formatDate(nowDate,
    DateUtil.FORMAT.DATEF_HORIZONTAL);
  if (nowDayOfWeek >= weekBegin && nowDayOfWeek <= weekEnd) {
   if (nowDate.after(DateUtil
     .parseString(nowDateStr + " " + beginTime))
     && nowDate.before(DateUtil.parseString(nowDateStr + " "
       + endTime)))
    return true;
   else
    return false;
  } else
   return false;
 }

}

 

 

分享到:
评论
6 楼 330217445 2009-09-01  
眼前一亮,还可以这样啊
5 楼 魔力猫咪 2009-09-01  
做几个不同的打包程序可能更好。演示版有演示版的build,在家有在家的Build。
4 楼 jinyanhui2008 2009-09-01  
好方法,不过可以根据session 或者 访问的url地址来动态切换数据源。
感觉这样更简单吧。
我现在的系统基本上能够达到根据不同的人访问分配不同的数据源来使用。
3 楼 wdl123 2009-02-22  
这样省事多了
2 楼 cftang9999 2009-02-18  
不错,免得手工改来改去了
1 楼 uclnn 2009-02-18  
太好了,好方便。

相关推荐

    mybatis-plus+动态数据源

    在IT行业中,数据库管理是核心任务之一,而动态数据源技术则是实现多数据库灵活切换的重要手段。本项目涉及的关键技术是"Mybatis-Plus"与"动态数据源"的结合使用,以及一系列相关的配置和扩展。下面将详细阐述这些...

    mybatis-plus多数据源/动态数据源配置示例代码

    本示例代码将介绍如何在项目中配置和使用MyBatis-Plus实现多数据源和动态数据源切换。 首先,我们需要理解多数据源的概念。多数据源意味着系统中存在不止一个数据存储,每个数据源可能对应不同的数据库,如MySQL、...

    通过Spring Boot配置动态数据源访问多个数据库的实现代码

    Spring Boot配置动态数据源访问多个数据库实现代码详解 通过Spring Boot配置动态数据源访问多个数据库可以实现数据库的动态增删和数量无限的支持,下面将详细介绍该实现代码的知识点。 数据源配置管理 在Spring ...

    基于springboot整理的分布式事务及动态数据源切换

    整理的分布式事务 及动态数据源切换 基于数据库XA协议 maven 包可直接使用 maven 引入路径: &lt;groupId&gt;com.maple&lt;/groupId&gt; &lt;artifactId&gt;DCSDataSourcesServer &lt;version&gt;0.0.1-SNAPSHOT 事务及数据源标签...

    spring动态数据源+mybatis分库分表

    "spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...

    springboot3.2.3集成shardingsphere5.4.1及动态数据源demo项目

    《SpringBoot 3.2.3 集成 ShardingSphere 5.4.1 及动态数据源实战解析》 在现代企业级应用开发中,数据分片和多数据源管理是提升系统性能和扩展性的关键技术。本文将详细探讨如何在SpringBoot 3.2.3环境下集成...

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务。一个基于springboot的快速集成多数据源的启动器。支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库...

    动态数据源实现spring

    在Spring框架中,动态数据源实现是一个重要的特性,它允许应用程序根据特定的条件或用户需求在运行时切换数据源。这种灵活性对于多租户系统、数据隔离或者在不同环境(如开发、测试、生产)之间切换数据库配置尤其...

    druid-动态数据源

    【标题】"druid-动态数据源"是一个针对SpringBoot和Maven集成的项目,它实现了多数据源的管理,并且具有动态切换数据源的能力。这个项目特别适用于那些需要处理多个数据库系统的单体项目或微服务架构。它支持MySQL、...

    springboot动态数据源代码实现,动态数据源代码,租户系统动态数据源代码

    项目实现了使用SpringBoot实现动态数据源,实现步骤: 1.租户通过域名访问接口,用filter获取租户独立标识,比如 zhangsan.localhost.com 、lisi.localhost.com 2.实现AbstractRoutingDataSource类来跟进当前访问的...

    springboot+mybatis多数据源+动态数据源配置(连接池)

    springboot+mybatis多数据源+动态数据源配置(连接池),mysql数据库,代码实现了简单的读写分离,但是不建议这种操作,建议使用数据库中间件进行读写分离,例如使用mycat进行读写分离主从热备,使用该代码对于多个...

    Mybatis动态数据源

    读写库分离,动态数据源切换,mybitis动态数据源,SSM动态数据源,多数据源

    springboot mybatis使用动态数据源的例子

    在Spring Boot应用中,MyBatis是一个常用的持久层框架,而动态数据源则是解决多数据库环境问题的关键技术。本文将详细讲解如何在Spring Boot中结合MyBatis实现动态数据源的配置,同时涵盖MyBatis的基本使用和Email的...

    mysql.c3p0配置动态数据源的依赖包

    MySQL.C3p0配置动态数据源是Java开发中常见的数据库连接池管理技术,它结合了MySQL数据库驱动和C3p0连接池库,为应用程序提供高效、稳定的数据库连接管理。在进行这样的配置时,需要引入特定的依赖包,确保项目的...

    根据用户动态切换数据源java代码 dynamicds

    在Java开发中,特别是在SpringBoot框架下,动态数据源是一个重要的功能,它允许应用程序根据不同的业务需求或用户权限切换到不同的数据库。动态数据源的实现能够极大地提高系统的灵活性和可扩展性,使得一个应用可以...

    springboot 1.5.9+mybatis动态指定数据源

    在大型分布式系统中,通常需要处理多个数据库,这就涉及到了动态数据源的概念。本文将深入探讨如何在Spring Boot 1.5.9版本中结合MyBatis实现动态指定数据源,并通过自定义注解来实现这一功能。 首先,我们需要理解...

    动态数据源之分库解析1(固定N数据源,切换多数据源)

    在Java和SpringMVC开发中,动态数据源是一种常见的需求,尤其在大型系统中,为了实现高可用性和负载均衡,通常会采用分库策略。"动态数据源之分库解析1(固定N数据源,切换多数据源)"这个主题正是针对这样的场景,...

    动态数据源配置1

    动态数据源配置1

    SpringBoot+Atomikos分布式事务及多数据源动态切换,两种demo

    本文将深入探讨如何在Spring Boot项目中实现Atomikos分布式事务以及动态数据源切换的两种示例。 首先,我们需要理解什么是分布式事务。在分布式系统中,事务需要跨越多个独立的数据库或服务进行操作。分布式事务的...

    mybatis+spring实现动态切换数据源

    在企业级应用开发中,动态数据源是一种常见需求,它允许程序在运行时根据不同的业务逻辑切换到不同的数据库。在本项目中,我们将探讨如何利用MyBatis与Spring框架实现动态切换数据源的功能。首先,我们需要理解...

Global site tag (gtag.js) - Google Analytics