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

  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5092558.html
Copyright © 2011-2022 走看看