业务场景及需求:全国每个银行营业网点【指跟公司合作的】产品上线后,肯定需要升级业务以应对新的功能需求,那么数据库每次升级更新时都是在数据库管理工具中执行升级脚本,非常不方便。此时需求:能够在业务系统代码中设置开关,需要升级的时候打开开关系统自动直接完成升级.
思路:1)数据库里面有个相应的版本号,服务里面有个版本文件【以要升级到的版本号命名】。
2)升级的时候查出服务里面的版本和数据库里面的版本,比对:如果版本一样不升级,如果版本不一样就执行服务里面的升级脚本.
下面看看主要的思路代码作为笔记,以后可以参考。
一)获取服务里面的所有脚本版本文件名称:以一个数组形式存在方便以后多个版本的时候扩展用。
/**
* 获取所有脚本版本文件名称
*/
private ArrayList<String> getVersionsForFilePath(){
String filePath = "";
ArrayList<String> fileName = new ArrayList<String>();
try {
// filePath为放置数据库升级脚本的目录
filePath = PropertiesHander.class.getResource("/assp/evoucher/sql/").toString();
filePath = filePath.replace("file:", "");
// 获取filePath下的所有文件名
File dir = new File(filePath);
// 返回此抽象路径下的文件
File[] files = dir.listFiles(); <strong> /<span style="color:#cc0000;">/展开该文件【以一个数组,因为该文件下可能有很多个文件夹或者文件】</span></strong>
for (int i = 0; i < files.length; i++) {
// 判断此文件是否是一个文件
if (files[i].isDirectory()) {
fileName.add(files[i].getName());
}
}
// 由小到大排序
String templte = "";
for (int i = 0; i < fileName.size() - 1; i++) {
for (int j = 0; j < fileName.size() - i - 1; j++) {
if (fileName.get(j).compareTo(fileName.get(j + 1)) > 0) {
templte = fileName.get(j);
fileName.set(j, fileName.get(j + 1));
fileName.set(j + 1, templte);
}
}
}
} catch (Exception e) {
throw new EVoucherException("获取自动升级脚本文件【 " +filePath+ " 】失败,检查配置是否正确。", e);
}
return fileName;
}
二)根据当前版号及当前服务使用的数据库类型获取对应升级脚本
/**
* 根据当前版号及当前服务使用的数据库类型获取对应升级脚本
* @param version
* @param userBbType
*/
public Map<String, String[]> getSqlScriptsForDBType(String version, String userBbType){
Map<String, String[]> map = new HashMap<String, String[]>();
try {
String filePath = DataBaseUPdateThread.class.getResource("/assp/evoucher/sql/" + version + "/" + userBbType).toString();
filePath = filePath.replace("file:", "");
// 获取filePath下的所有文件名
File dir = new File(filePath);
// 返回此抽象路径下的文件
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
// 判断此文件是否是一个文件
if (!files[i].isDirectory()) {
map.put(files[i].getName(), this.getResourceString(files[i].getPath()));
logger.info("获取版本号【 " + version + " 】,数据库类型为【 " + userBbType + " 】对应的升级脚本【 " + files[i].getName() + " 】完成。");
}
}
} catch (Exception e) {
throw new EVoucherException("获取版本号【 " + version + " 】,数据库类型为【 " + userBbType + " 】对应的升级脚本失败。", e);
}
return map;
}
三)根据路径获取数据库脚本
/**
* 根据路径获取数据库脚本
* @param sqlAbsolutePath
* @return
* @throws Exception
*/
private String[] getResourceString(String sqlAbsolutePath) throws Exception {
// 返回读取指定资源的输入流
InputStream is = new FileInputStream(sqlAbsolutePath);
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
String s = "";
StringBuffer sb = new StringBuffer();
while ((s = br.readLine()) != null)
sb.append(s).append("\n");
if(br != null){
br.close();
}
if (is != null) {
is.close();
}
return sb.toString().split(";");
}