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;
}
}
分享到:
相关推荐
整理的分布式事务 及动态数据源切换 基于数据库XA协议 maven 包可直接使用 maven 引入路径: <groupId>com.maple</groupId> <artifactId>DCSDataSourcesServer <version>0.0.1-SNAPSHOT 事务及数据源标签...
mybatis-plus+动态数据源+自定义数据源配置+dom解析+自定义参数注入(注解)+AOP切换数据源+druid
基于Springboot+MyBatis-Plus实现多租户动态数据源模式源码.zip 基于Springboot+MyBatis-Plus实现多租户动态数据源模式源码.zip 基于Springboot+MyBatis-Plus实现多租户动态数据源模式源码.zip 【备注】 主要针对...
项目实现了使用SpringBoot实现动态数据源,实现步骤: 1.租户通过域名访问接口,用filter获取租户独立标识,比如 zhangsan.localhost.com 、lisi.localhost.com 2.实现AbstractRoutingDataSource类来跟进当前访问的...
springboot+mybatis多数据源+动态数据源配置(连接池),mysql数据库,代码实现了简单的读写分离,但是不建议这种操作,建议使用数据库中间件进行读写分离,例如使用mycat进行读写分离主从热备,使用该代码对于多个...
读写库分离,动态数据源切换,mybitis动态数据源,SSM动态数据源,多数据源
spring动态数据源整合mybatis实现的分库分表操作。 分库分表对业务代码是透明的,只需要在配置文件分配分库模版即可动态的实现分库分表的增删改查操作。
mybatis-plus 多数据源/动态数据源配置示例代码
动态数据源配置1
基于springboot和maven、druid整合的多数据源项目,可以直接在企业开发中使用的动态数据源,可以用于单体项目或者微服务使用,支持mysql,pgsql,oracle等
SPRING框架中,动态数据源连接的实现。 可以根据用户来选择连接的数据库。
主要介绍了通过Spring Boot配置动态数据源访问多个数据库的实现代码,需要的朋友可以参考下
mysql.c3p0配置动态数据源的依赖包,必须导入到项目当中。
Spring AOP + SpringMVC +Mybatis做动态数据源,实现读写分离Spring AOP + SpringMVC +Mybatis做动态数据源,实现读写分离Spring AOP + SpringMVC +Mybatis做动态数据源,实现读写分离
数据源连接池的基本用法,...实现数据源的动态切换和案例 数据源连接池的基本用法,配置信息,代码案例、 实现数据源的动态切换和案例 数据源连接池的基本用法,配置信息,代码案例、 实现数据源的动态切换和案例
基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务。一个基于springboot的快速集成多数据源的启动器。支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库...
springboot mybatis 使用动态数据源的配置 包含mybatis 的 使用以及email的配置使用 可以自己设置使用不同环境下的文件配置
<动态数据源之分库解析1(固定N数据源,切换多数据源)>文章的代码
个人新项目基于Springboot+MyBatisPlus实现多租户动态数据源模式源码(可作毕设).zip个人新项目基于Springboot+MyBatisPlus实现多租户动态数据源模式源码(可作毕设).zip 个人新项目基于Springboot+MyBatisPlus实现多...
Spring Boot 动态数据源(多数据源自动切换),原作者博客地址:http://blog.csdn.net/catoop/article/details/50575038,亲测可用,复制到文档方便以后用,非常感谢原作者,如有侵权请您及时联系,。以前自己配置了...