zoukankan      html  css  js  c++  java
  • 数据库升级代码学习

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


    思路: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("
    ");
    		if(br != null){
    			br.close();
    		}
    		if (is != null) {
    			is.close();
    		}
    		return sb.toString().split(";");
    	}

  • 相关阅读:
    DOM基础(二)
    DOM基础(一)
    JS入门(五)
    linux的用法
    一道关于运行顺序题
    vue框架
    HTML的知识点
    从队友那偷来的主席树模板(静态区间第k小)
    网络流基础模型——任务分配模型(HDU 3572)
    HDU 5521 Meeting(建图思维)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5092558.html
Copyright © 2011-2022 走看看