发表时间:2009-02-18
最后修改:2009-02-19
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;
}
}