数据库升级代码学习

      业务场景及需求:全国每一个银行营业网点【指跟公司合作的】产品上线后。肯定须要升级业务以应对新的功能需求,那么数据库每次升级更新时都是在数据库管理工具中运行升级脚本。很不方便。此时需求:可以在业务系统代码中设置开关,须要升级的时候打开开关系统自己主动直接完毕升级.


思路: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(";");
	}

posted @ 2015-12-31 19:19  hrhguanli  阅读(345)  评论(0编辑  收藏  举报