背景:服務請求一體化項目升級到V4的服務請求類型時,全部配置庫數據遷移到各省的業務庫中,雖然數據出現大量冗餘,可是這是惟一能解決V4 大量服務請求類型不在同一張表中的騷操做了,防止查詢服務請求類型時GG。可是惟一考慮不足的就是對於全網需求的碼錶數據腳本新增出現腳本編寫困難,大量重複沒有意義的工做,佔據了開發人員的大把時間,同時,對DBA來講這也是個噩夢,可是沒有辦法,規定不改就是這樣。ajax
針對以上問題,爲了釋放開發勞動力的大把時間(懶) 小民構思出了如下的工具。sql
根據開發人員提供的腳本模板自動生成其餘30+省的數據庫腳本。數據庫
本工具的實現思路:緩存
各省端腳本除了 省份編碼不一樣外,還有就是擡頭不一樣,擡頭包含 數據庫ip 數據庫名稱,聯繫人,電話,操做條數。咱們能夠將31個省的數據庫IP 用戶名 配置在數據庫中,其餘數據由用戶在上傳文件時提供。 後臺首先查詢擡頭模板,替換掉用戶提供的數據,再解析SQL模板,查詢各省配置數據,遍歷動態生成不一樣省的腳本文件。服務器
數據庫表涉及:app
-- 擡頭模板表
CREATE TABLE `t_head_templat` ( `uid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PRK', `template_code` varchar(32) DEFAULT NULL COMMENT '模板類型ID', `template_rmk` varchar(32) DEFAULT NULL COMMENT '模板類型名稱', `template_value` varchar(2000) DEFAULT NULL COMMENT '模板內容', `crtime` datetime DEFAULT NULL COMMENT '建立時間', PRIMARY KEY (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
-- 省份數據庫IP表 CREATE TABLE `t_provcode_ip` ( `uid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PRK', `provcode` varchar(32) DEFAULT NULL COMMENT '省份編碼', `provname` varchar(32) DEFAULT NULL COMMENT '省份名稱', `ip` varchar(32) DEFAULT NULL COMMENT 'ip', `port` varchar(10) DEFAULT NULL COMMENT '端口', `sql_name` varchar(20) DEFAULT NULL COMMENT '數據庫名', `user_name` varchar(20) DEFAULT NULL COMMENT '數據庫用戶名', `crtime` datetime DEFAULT NULL COMMENT '建立時間', PRIMARY KEY (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8
1.文件上傳工具
文件格式校驗測試
必填參數校驗ui
2.解析sql文件,存放於list中編碼
3.查詢省份IP及擡頭模板
4.遍歷省份數據庫信息 組裝擡頭,將數據依次寫入指定路徑
5.全部省份數據進行壓縮
6.提供下載數據頁面
7.提供清楚指定用戶數據接口
代碼不提供了,沒有多少技術含量,這裏說下須要注意的細節:
1.使用IO的時候必定記得flush()
2.使用表單上傳文件的時候帶參數的操做 貼一部分吧
function submitFile() { var fileObj = document.getElementById("customFile").files[0]; // js 獲取文件對象 var FileController = "uploadSql"; // 接收上傳文件的後臺地址 var userId = $('#userId').val(); var tel = $('#tel').val(); var totalId = $('#totalId').val(); var fileNameId = $('#fileNameId').val(); // FormData 對象 var form = new FormData(); form.append("file", fileObj); // 文件對象 form.append("userName", userId); // user form.append("phone", tel); // phone form.append("total", totalId); // 總數 form.append("fileName", fileNameId); // 文件名稱 //參數校驗 if(userId.trim() === "" || tel.trim() === "" || totalId.trim() === "" || fileNameId.trim() === ""){ layer.msg("以上參數均爲必填參數,請正確輸入", {icon: 6, time: 2000}); return; } if(fileObj){ if(fileObj.name.substring(fileObj.name.length-4) != ".txt"){ layer.msg("文件模板必須爲txt類型", {icon: 6, time: 2000}); return; } }else{ layer.msg("請選擇上傳文件", {icon: 6, time: 2000}); return; } $.ajax({ type: "POST", url: "uploadSql", data: form, processData: false, contentType: false, cache: false,//上傳文件無需緩存 success: function (data) { window.location.href = "downLoadSqlFiles"; } }); }
3.寫文件的路徑,也是最坑的地方。這裏必定要使用絕對路徑,不能使用相對路徑。
個人打的war包部署在Linux服務器上,開始是已相對路徑寫的,本地測試沒有一點問題,可是上了環境後就出現了大問題
1.數據寫的地方不對,數據寫到Tomcat bin目錄下了,一開始沒有想到這個問題,一直百度都沒有答案,後來 find / -name 翟育濤.zip 發現了數據存錯位置了
2.解決方法,使用絕對路徑,首先是絕對路徑的獲取,而後拼接文件要放的數據。
String path = null; try { path = ResourceUtils.getURL("classpath:").getPath()+"/static/sql/"+ MapUtils.getString(map,"userName"); } catch (FileNotFoundException e) { e.printStackTrace(); }
Over 歡迎使用
操做手冊:
--by 宅小濤
1.首先您應該準備您的腳本模板 以Insert腳本爲例,須要注意如下幾點:
1.文件應該是txt文件。
2.每條語句都應該是正確無誤的可執行語句。
3.每條插入語句不要換行,按照中移規範編寫。
4.腳本應以雲南編寫 即 provcode 應該爲 00030016
5.腳本不要添加擡頭。
正確腳本 eg:
2.根據頁面要求,您必須輸入如下內容:
1.聯繫人、電話:根據中移數據腳本規範要,腳本內部擡頭的註釋裏面須要添加聯繫人和電話;
2.操做數量:擡頭中填寫的操做的數據量,若是已知請填寫具體數字,該字段一樣是必填,能夠填寫未知
3.文件名稱:生成的腳本的名稱,由於生成的腳本是31個省+2個二線機構+重客的腳本,所以名稱須要加以區分
例如須要生成的腳本的命名以下:
則這裏須要填寫的文件名稱爲:
洛陽-服務請求-生產-@@-ngwf-20190314-2-2-insert-sql
注意:1.文件名稱不要加後綴;2.@@必須存在,腳本會被覆蓋。3.不要添加腳本頂的註釋,註釋會自動生成。